当我使用 user() 时如何在中间件中获取 id
How to get id in Middleware when i use user()
我有一个用户和角色之间的关系。在中间件中,我需要获取角色来检查角色是1还是2。但是,我得到以下错误。
"Trying to get property 'role_id' of non-object."
我确定我在 role_id 中有 id 1。
用户模型
public function role()
{
return $this->belongsTo(Role::class, 'role_id');
}
public function handle($request, Closure $next)
{
if (!Auth()->check() && $request->user()->role_id == 1) {
return redirect()->back();
}
return $next($request);
}
您的 if
语句的逻辑错误地检查了用户是否已登录 out,同时还检查了用户的角色。如果 Auth::check()
是 false
,则用户未登录并且 $request->user()
将 return null
.
从条件中删除 !
将修复您收到的错误。
public function handle($request, Closure $next)
{
if (Auth()->check() && $request->user()->role_id == 1) {
return redirect()->back();
}
return $next($request);
}
但是,这将允许所有来宾继续,这可能是您不希望的。假设您希望中间件只允许具有特定角色的登录用户继续,请使用像这样的更白名单的方法:
public function handle($request, Closure $next)
{
// Role ID 2 has permission to proceed
if (Auth()->check() && $request->user()->role_id == 2) {
return $next($request);
}
// Everyone else should go back, including logged-in users and guests.
return redirect()->back();
}
[无法发表评论,所以我正在制作 post。]
Aken 已经回答了你,但我还建议再做一件事。不要使用 1 或 2 作为 ID,而是使用常量:
public function handle($request, Closure $next)
{
if (Auth()->check() && $request->user()->role_id == ADMIN) {
return $next($request);
}
return redirect()->back();
}
您甚至不需要对此发表评论。也许更好:
public function handle($request, Closure $next)
{
if (Auth()->check() && $request->user()->isAdmin()) {
return $next($request);
}
return redirect()->back();
}
但需要自己实现。
我有一个用户和角色之间的关系。在中间件中,我需要获取角色来检查角色是1还是2。但是,我得到以下错误。
"Trying to get property 'role_id' of non-object."
我确定我在 role_id 中有 id 1。
用户模型
public function role()
{
return $this->belongsTo(Role::class, 'role_id');
}
public function handle($request, Closure $next)
{
if (!Auth()->check() && $request->user()->role_id == 1) {
return redirect()->back();
}
return $next($request);
}
您的 if
语句的逻辑错误地检查了用户是否已登录 out,同时还检查了用户的角色。如果 Auth::check()
是 false
,则用户未登录并且 $request->user()
将 return null
.
从条件中删除 !
将修复您收到的错误。
public function handle($request, Closure $next)
{
if (Auth()->check() && $request->user()->role_id == 1) {
return redirect()->back();
}
return $next($request);
}
但是,这将允许所有来宾继续,这可能是您不希望的。假设您希望中间件只允许具有特定角色的登录用户继续,请使用像这样的更白名单的方法:
public function handle($request, Closure $next)
{
// Role ID 2 has permission to proceed
if (Auth()->check() && $request->user()->role_id == 2) {
return $next($request);
}
// Everyone else should go back, including logged-in users and guests.
return redirect()->back();
}
[无法发表评论,所以我正在制作 post。]
Aken 已经回答了你,但我还建议再做一件事。不要使用 1 或 2 作为 ID,而是使用常量:
public function handle($request, Closure $next)
{
if (Auth()->check() && $request->user()->role_id == ADMIN) {
return $next($request);
}
return redirect()->back();
}
您甚至不需要对此发表评论。也许更好:
public function handle($request, Closure $next)
{
if (Auth()->check() && $request->user()->isAdmin()) {
return $next($request);
}
return redirect()->back();
}
但需要自己实现。