当我使用 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。]

A​​ken 已经回答了你,但我还建议再做一件事。不要使用 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();
}

但需要自己实现。