我如何注入用户,这样我就不必在 Laravel 请求中查找他?

How do I inject user so I do not have to look him up in Laravel request?

我正在学习有关 Laravel 签名路线的教程:

https://dev.to/fwartner/laravel-56---user-activation-with-signed-routes--notifications-oaa

要创建签名路由作者这样做:

$url = URL::signedRoute('activate-email', ['user' => $this->user->id]);

注意 'user' 他只分配了 id...

稍后当有问题的用户单击生成的 link 并且代码的另一部分执行此操作时:

Route::get('/activate-email/{user}', function (Request $request) {
    if (!$request->hasValidSignature()) {
        abort(401, 'This link is not valid.');
    }

    $request->user()->update([
        'is_activated' => true
    ]);

    return 'Your account is now activated!';
})->name('activate-email');

我对这部分感到困惑:

$request->user()->update([
    'is_activated' => true
]);

作者直接访问 user() 并在他身上运行更新?

当我在自己的代码中尝试这样做时:

dd($request->user()) 我得到了 null 如果我尝试了 dd($request->user) 我得到了用户 ID 号。

作者如何在不查找用户的情况下调用 user()->update。我没有看到他在哪里注入用户对象,所以对我来说这似乎很神奇,或者作者没有完全测试他自己的代码,它在 GitHub: https://github.com/fwartner/laravel-user-activation

那么如何将用户注入路由,这样我就不必使用

显式查找他
$user = User::find($request->user);

user() 方法在 Request 对象上定义。请参阅 api 文档:

https://laravel.com/api/5.6/Illuminate/Http/Request.html#method_user

如果您的路由使用了 auth guard,则用户将被绑定到每个请求。

作为替代方案,您始终可以使用 Auth 门面或 auth 助手来访问用户:

Auth::user()
// or
auth()->user()

$request->user$request->user()有区别

$request->user()auth()->user() 相同,因此它正在获取经过身份验证的用户。

$request->user只是获取请求对象中的参数user。

如果您想直接获取用户而不进行查询以从数据库中检索它,您必须像这样将其直接注入路由(或方法)中(假设您的用户模型是 User.php) :

Route::get('/activate-email/{user}', function (User $user, Request $request) {
    if (!$request->hasValidSignature()) {
        abort(401, 'This link is not valid.');
    }

    $request->user()->update([
        'is_activated' => true
    ]);

    return 'Your account is now activated!';
})->name('activate-email');

注意 $user 与路由中的 {user} 匹配(这将自动进行模型绑定)