php - 在 nul 上调用成员函数 hasRoles()
问题描述
我是 Laravel 的新手
我已经在我的应用程序中设置了权限和角色,并将它们分配给用户 - 但是当我尝试使用 hasRole 或 hasAnyRole 时,它对我不起作用。
这是我的中间件:
namespace App\Http\Middleware;
use Closure;
use Auth;
class AccessAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->hasRoles('Admin')){
return $next($request);
}
return redirect('home');
}
}
<?php
好榜样
命名空间应用程序;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public function users(){
return $this->belongsToMany('App\User');
}
}
User Model
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function roles(){
return $this->belongsToMany('App\Role');
}
public function hasAnyRoles($roles){
return null !== $this->roles()->whereIn('name',$roles)->first();
}
public function hasRoles($role){
return null !== $this->roles()->where('name',$role)->first();
}
}
产生此错误:
FatalThrowableError (E_ERROR) 在 null 上调用成员函数 hasRole()
解决方案
如果没有登录用户则 Auth::user() 为空,请尝试以下操作
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class AccessAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(!Auth::guest() && Auth::user()->hasRoles('Admin')){
return $next($request);
}
return redirect('home');
}
}
这个中间件和你原来的一样,但它会检查以确保用户首先登录。如果他们没有登录,或者他们不是管理员,它将重定向到主页。
推荐阅读
- java - 如何为实体内的对象中的参数生成自定义查询
- c++ - 在 gmock 中使用指向带有 EXPECT_CALL 的模拟对象的指针会导致段错误或默认处理程序启动
- c++ - int* a 和 int* a =new int 的区别
- php - 如何在不提取的情况下在php中打开文件系统映像
- css - 忽略模态中的 CSS
- javascript - 语义 UI 搜索表单未获取对象数据
- linux - 端口 8080 上的 Nginx HTTPS
- c - C结构初始化
- angular - 延迟加载 Angular 与传统 MPA 有什么区别?
- visual-studio-2019 - 我无法在 CefSharp (ChromiumBrowser) 中观看 youtube 直播