php - Laravel 7 门中多个授权的冗长代码是什么?
问题描述
我正在App\Providers\AuthServiceProvider
为用户角色定义大门。用户对他们的角色有价值。like : (1,2,3,4)
在用户管理中赋予的角色和所有用户都可以拥有多个授权。
用户角色是:
- 人员编辑(值 = 1)
- 添加机构(值 = 2)
- 用户管理(值 = 3)
- 添加记录(值 = 4)
为了隐藏侧边栏中的一些信息,我使用了 Blade 指令(@can)
。我需要根据每个用户的授权隐藏侧边栏中的部分。
我使用的有效且漫长的方法是:
AuthServiceProvider.php
....
Gate::define('personnel-method', function ($user) {
if(in_array(1,explode(",",$user->yetki)))
return true;
else
return false;
});
Gate::define('add-method', function ($user) {
if(in_array(2,explode(",",$user->yetki)))
return true;
else
return false;
});
Gate::define('user-method', function ($user) {
if(in_array(3,explode(",",$user->yetki)))
return true;
else
return false;
});
Gate::define('adding-method', function ($user) {
if(in_array(4,explode(",",$user->yetki)))
return true;
else
return false;
});
.....
sidebar.blade.php:
<ul>
@can('personnel-method') <li>Personnel Edit </li> @endcan
@can('add-method') <li>Add institution</li>@endcan
@can('user-method')<li>User Management</li>@endcan
@can('adding-method') <li>Adding Record</li>@endcan
</ul>
那么有没有更简洁的代码来做到这一点?
解决方案
您可以使用属性转换。您可以使用“数组”转换并将数据库中的值更改为 JSON ( [1,2,3,4]
),或者定义一个自定义转换来拆分字符串。
使用array
演员表:
class User extends Model {
protected $casts = [
'yetki' => 'array',
];
//...
}
因此,您可以将门更改为:
Gate::define('personnel-method', function ($user) {
if(in_array(1, $user->yetki))
return true;
else
return false;
});
而且由于您正在检查布尔值,因此您不必使用 anif
并且只需返回条件:
Gate::define('personnel-method', function ($user) {
return in_array(1, $user->yetki);
});
为了使其更易于阅读,您可以将该逻辑移动到User
类上的方法中:
class User extends Model {
public function hasRole($role)
{
return in_array($role, $this->yetki);
}
}
最后,您可以在类中定义角色:
abstract class UserRole {
const Personnel_Edit = 1;
const Add_institution = 2;
const User_Management = 3;
const Adding_Record = 4;
}
并将门更改为:
Gate::define('personnel-method', function ($user) {
return $user->hasRole(UserRole::Personnel_Edit);
});
推荐阅读
- angular - 将身份验证参数传递给服务器上的 power-bi 报告服务
- javascript - 使用变量获取位置,然后修改 mongodb 中的特定对象
- excel - 有没有办法跳过错误“找不到文件名”并移动到下一个文件
- ada - 发现命令行编译GNAT有错误
- rabbitmq - RabbitMQ 不会启用管理插件
- bluetooth-lowenergy - 如何自定义 BlueZ?
- tensorflow - 我想在张量流中的张量 3D 上放置一个二进制掩码向量
- typescript - 当参数的类型是泛型时,是否可以在打字稿中为参数设置默认值?
- c# - 如何解决 Xamarin Forms UWP 应用程序“参数不正确”中的崩溃问题。
- sql - 更新 JOIN 表内容