我如何注入用户,这样我就不必在 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}
匹配(这将自动进行模型绑定)
我正在学习有关 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}
匹配(这将自动进行模型绑定)