会话过期时调用成员函数出错(中间件)
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.');
}
}
当我的会话到期并重新加载页面时,我收到以下错误(在以下代码块中发出信号的行):
Error: Call to a member function
hasRole()
onnull
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.');
}
}