我的项目使用Laravel 8,在这个项目中,我创建了一个名为Admin
的自定义中间件,如下所示:
public function handle(Request $request, Closure $next)
{
if (Auth::user()->isAdmin()) {
return $next($request);
}
return redirect('/');
}
我试着这样应用它:
Route::middleware('admin')->group(function () {
Route::get('test', function () { return "User is authenticated and is an admin."; });
});
在Kernel.php
上的$middlewareGroups
部分:
'admin' => [
'auth',
AppHttpMiddlewareAdmin::class
],
因此,我在用户模型中调用了isAdmin()
,它只是检查用户的角色是否正确:
public function role()
{
return $this->belongsTo(Role::class);
}
public function isAdmin()
{
return $this->role->contains('slug', 'super-admin');
}
但现在的问题是,当我转到/test
uri时,它不会将我重定向到('/')
uri,并向我显示以下错误:
BadMethodCallException调用未定义的方法App\Models\Role::contains((
那么,这里出了什么问题?如何解决此问题?
注意,roles
和users
表之间的关系是一对多。这就是为什么我写role()
而不是roles()
,因为每个用户只有一个角色。
当您使用belongsTo
关系时,laravel将直接返回模型,而不是模型的集合。
当你打电话时:
$this->role
您得到的要么是null(如果关系不存在(,要么是Role
模型。您可以相应地编写isAdmin
函数:
public function isAdmin()
{
return empty($this->role) ? false : $this->role->slug === 'super-admin';
}
您可能从一个具有多对多关系的示例中复制了代码:在这种情况下,Laravel将返回一个模型集合,您可以在它上调用集合方法,例如contains
我们可以看到你的角色模型的片段吗。