16

我正在使用Laravel 5.3并且正在尝试在该方法中获取经过身份验证的用户,因此我可以按分配的公司过滤用户,如下所示:idconstructor

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);
        }

    }

但是,这不会返回 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

任何想法为什么这会失败?

4

3 回答 3

19

文档

您无法在控制器的构造函数中访问会话或经过身份验证的用户,因为中间件尚未运行。

作为替代方案,您可以直接在控制器的构造函数中定义基于闭包的中间件。在使用此功能之前,请确保您的应用程序运行的是 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);
        });
    }
}
于 2016-08-28T09:41:56.113 回答
9

由于 5.3Auth::check无法在控制器的构造器中工作,因此这是未记录的更改之一。因此,您需要将其移至中间件或签入控制器方法,或将项目移至 5.2.x。

于 2016-08-28T05:31:52.387 回答
2

它失败了,因为你调用$this->middleware('auth');after parent::__construct();。这意味着您的身份验证中间件未正确加载。

于 2016-08-27T22:24:56.597 回答