为什么我不能在laravel控制器构造中获取请求属性?

时间:2016-12-22 11:16:13

标签: php laravel laravel-5

我试图通过执行dd(auth()->user());在laravel的控制器的constuctor中获取经过身份验证的用户,并且它表示null。我甚至将用户ID添加到我的一个中间件中的请求属性中,如下所示:

$request->attributes->add(['auth_user_id' => $user_id]);

即使我在控制器的构造方法中执行dd($request->get('auth_user_id'),我也会得到null。但是当我在测试路径中做同样的事情时,两个die转储语句都能很好地工作,并根据我的要求返回用户或用户ID。

为什么我无法在控制器的构造方法中获取这些内容?我甚至能够在我的控制器方法中获得相同的用户ID和auth用户请求。只是不是构造方法。我错过了什么?

2 个答案:

答案 0 :(得分:1)

使用Laravel 5.3,引入了此更改,其中在构建控制器类之后初始化中间件。这意味着控制器的Auth --specifically Auth::user()方法无法使用像__construct()这样的关键中间件。

请参阅此文档。 https://github.com/laravel/docs/blob/5.3/upgrade.md#session-in-the-constructor

修改

这样您就可以实现所需的功能。

这将允许在控制器的构造函数中注册闭包中间件,以便可以调用任何auth/session内容并将其设置为控制器上的属性:

public function __construct()
{
    $this->middleware(function ($request, $next) {
        $this->user = $request->user();

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

Controller closure middleware - JosephSilber

推荐此链接

答案 1 :(得分:0)

我认为这是因为构造函数方法在类初始化时被调用,当时你没有登录,当你没有登录时,你无法获得 auth_user_id

但是在普通方法的情况下,它们是在构造方法之后调用的,并且您已经登录了为什么您能够获得 auth_user_id