Проверка подлинности Laravel 5.3 в конструкторе, возвращающем false

я использую Laravel 5.3 и я пытаюсь получить подлинности пользователя id в constructor метод, чтобы я мог фильтровать пользователя по назначенной компании следующим образом:

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Support\Facades\View;
use App\Models\User;
use App\Models\Company;
use Illuminate\Support\Facades\Auth;class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests ;

public $user;
public $company;public function __construct()
{$companies = Company::pluck('name', 'id');
$companies->prepend('Please select');
view()->share('companies', $companies);
$this->user = User::with('profile')->where('id', \Auth::id())->first();
if(isset($this->user->company_id)){
$this->company = Company::find($this->user->company_id);
if (!isset($this->company)) {
$this->company = new Company();
}
view()->share('company', $this->company);
view()->share('user', $this->user);
}

}

Однако это не возвращает пользователя id, Я даже пытался Auth::check() и это не работает.

Если я перееду Auth::check() вне __construct() Метод, то это работает следующим образом:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
$this->middleware('auth');
}

/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
dd(\Auth::check());
return view('home');
}
}

Однако это терпит неудачу если я положу это в методе конструкции в HomeController тоже!

Есть идеи, почему это не удается?

12

Решение

документы

вы не можете получить доступ к сеансу или аутентифицированному пользователю в вашем
конструктор контроллера, потому что промежуточное ПО еще не запущено.

В качестве альтернативы вы можете определить промежуточное ПО на основе Closure
в конструкторе вашего контроллера. Перед использованием этой функции убедитесь, что
что ваше приложение работает под управлением Laravel 5.3.4 или выше:

class ProjectController extends Controller
{
/**
* All of the current user's projects.
*/
protected $projects;

/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->projects = Auth::user()->projects;

return $next($request);
});
}
}
7

Другие решения

С 5.3 Auth::check не будет работать в контроллере контроллера, это одно из недокументированных изменений. Итак, вам нужно переместить его в промежуточное программное обеспечение или вместо этого выполнить проверку в методах контроллера или переместить проект в 5.2.x.

8

Это не удается, потому что вы звоните $this->middleware('auth'); после parent::__construct();, Это означает, что ваше промежуточное ПО не загружено должным образом.

2
По вопросам рекламы [email protected]