我在用户和角色之间有关系。在中间件中,我需要获取角色以检查角色是1还是2。但是,出现以下错误。
“试图获取非对象的属性'role_id'。”
我确定我的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);
}
答案 0 :(得分:0)
您的if
语句的逻辑是错误地检查用户是否登出,同时还检查用户的角色。如果Auth::check()
是false
,则用户未登录,$request->user()
将返回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();
}
答案 1 :(得分:0)
[无法发表评论,所以我要发布一个帖子。]
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();
}
但是您需要自己实现。