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

时间:2018-06-27 17:38:41

标签: php laravel laravel-5

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

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

要创建签名的路线作者,请执行以下操作:

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

请注意,他仅向ID分配了ID ...

稍后,当相关用户点击生成的链接而另一部分代码执行此操作时:

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())我为空,如果尝试 dd($ request-> user)我得到了用户ID号。

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

那么我该如何将用户注入到路线中,所以不必显式地用

查找用户
$user = User::find($request->user);

2 个答案:

答案 0 :(得分:1)

<ul>对象上定义了user()方法。请参阅api文档:

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

如果您的路由使用的是身份验证防护,则将在每个请求上绑定用户。

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

auth

答案 1 :(得分:1)

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

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

$request->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}相匹配(这将自动进行模型绑定)