我正在关注有关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);
答案 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}
相匹配(这将自动进行模型绑定)