php - 使用中间件获取管理员权限
问题描述
当我尝试编写管理规则以防止用户输入特定路线时,我收到此错误:此集合实例上不存在属性 [名称]。
用户模型
<?php
public function roles()
{
return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
}
public function isAdmin()
{
if ($this->roles->name == "Admin") {
return true;
}
return false;
}
管理中间件
public function handle($request, Closure $next)
{
if (Auth::check()) {
if (Auth::user()->isAdmin()) {
return $next($request);
}
}
return redirect('/');
}
路由和控制器
Route::group(['middleware' => 'admin'], function ()
{
Route::get('/home', 'HomeController@index')->name('home');
});
public function __construct()
{
$this->middleware('admin');
}
解决方案
模型上的roles()
关系是多对多的,因此调用$this->roles
返回模型集合,而不是单个模型实例。如果要检查是否Admin
是当前用户拥有的角色之一,请尝试以下操作:
public function isAdmin()
{
if ($this->roles->pluck('name')->contains('Admin')) {
return true;
}
return false;
}
该pluck()
方法从您的集合(在本例中为名称字段)中返回一个“列”数据作为新集合。该contains()
方法在集合中搜索给定值,如果集合包含该值,则返回 true,否则返回 false。
推荐阅读
- javascript - 尝试使用 Lodash Angular 6 进行排序时出现错误
- php - 如何通过 PHP 查询脚本更改 phpMyAdmin 根密码
- testing - 无法在 TestCafe 中使用 PageObjects 从 .before 打开 Url (.navigateTo)
- oracle - 这个循环结束时 NULL 的目的是什么?
- java - 为什么介绍性书中定义的关于类型转换和算术运算符的规则看似冲突?
- android - 从 Android 中的 socket.on 消息回调调用函数
- reactjs - 在 props.children 中访问父属性
- angular - 角度离子 - 如何将点击事件添加到动态创建的 div
- salt-stack - 我如何实现可选要求?
- javascript - 按钮 - 悬停时转到锚点 URL 1,单击时转到 URL 2