会话过期时调用成员函数出错(中间件)

Error calling member function when session expires (middleware)

当我的会话到期并重新加载页面时,我收到以下错误(在以下代码块中发出信号的行):

Error: Call to a member function hasRole() on null

class AdminMiddleware
{
    public function handle($request, Closure $next) {
        if ($request->user()->hasRole('admin')) // this line
            return $next( $request );
        else
            abort( 401, 'Esta acción no está autorizada.' );
    }
}

hasRole() 是我的 User 模型中的一个函数,用于检查用户是否有权访问某些管理路由:

class User extends Authenticatable
{
    /**
     *  Role-user relation (one-to-many)
     */
    public function roles() {
        return $this->belongsToMany( Role::class )->withTimestamps();
    }


    /**
     *  Authorize roles
     */
    public function authorizeRoles($roles) {
        if ($this->hasAnyRole($roles))
            return true;

        abort( 401, 'Esta acción no está autorizada.' );
    }


    /**
     *  Check if user has specified role
     */
    public function hasRole($role) {
        if ($this->roles()->where('name', $role)->first())
            return true;

        return false;
    }
}

$request->user() 只有在会话实际存在时才包含经过身份验证的用户对象。如果会话像您描述的那样过期,这将 return 为空。你在使用的时候要考虑到这一点:

class AdminMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        if (\Auth::check() && $request->user()->hasRole('admin')) {
            return $next($request);
        }

        abort(401, 'Esta acción no está autorizada.');
    }
}