Laravel 8:调用未定义的方法Model::contains()



我的项目使用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');
}

但现在的问题是,当我转到/testuri时,它不会将我重定向到('/')uri,并向我显示以下错误:

BadMethodCallException调用未定义的方法App\Models\Role::contains((

那么,这里出了什么问题?如何解决此问题?

注意,rolesusers表之间的关系是一对多。这就是为什么我写role()而不是roles(),因为每个用户只有一个角色。

当您使用belongsTo关系时,laravel将直接返回模型,而不是模型的集合。

当你打电话时:

$this->role

您得到的要么是null(如果关系不存在(,要么是Role模型。您可以相应地编写isAdmin函数:

public function isAdmin()
{
return empty($this->role) ? false : $this->role->slug === 'super-admin';
}

您可能从一个具有多对多关系的示例中复制了代码:在这种情况下,Laravel将返回一个模型集合,您可以在它上调用集合方法,例如contains

我们可以看到你的角色模型的片段吗。

最新更新