我有3个用于管理用户权限的模型。
class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany('App\Models\Role');
}
}
class Role extends Model
{
public function users()
{
return $this->belongsToMany('App\Models\User');
}
public function permissions()
{
return $this->belongsToMany('App\Models\Permission');
}
}
class Permission extends Model
{
public function roles()
{
return $this->belongsToMany('App\Models\Role');
}
public function roleHavePermission(Role $role)
{
if ($this->roles()->find($role->id)) {
return true;
}
return false;
}
public function userHavePermission(User $user = null)
{
$roles = [];
if (is_null($user)) {
$roles[] = Role::where('slug', 'guest')->first();
} else {
foreach ($user->roles as $role) {
$roles[] = $role;
}
}
foreach ($roles as $role) {
if ($this->roleHavePermission($role)) {
return true;
}
}
return false;
}
}
现在因为我的应用程序已经增长,我正在转向存储库。例如,这是我的PermissionRepository
:
class PermissionRepository implements PermissionRepositoryInterface
{
protected $roleRepository;
/**
* PermissionRepository constructor.
* @param RoleRepositoryInterface $roleRepository
*/
public function __construct(RoleRepositoryInterface $roleRepository)
{
$this->roleRepository = $roleRepository;
}
public function action($routeName)
{
return Permission::where('action', $routeName)->first();
}
}
如何在此存储库中实现roleHavePermission
和userHavePermission
?我尝试使用以下语法实现roles
方法:
public function roles()
{
return Permission::roles();
}
但它不会工作,因为Permission的角色方法不能静态调用。感谢。
答案 0 :(得分:1)
事实上,在我看来,你不应该在存储库中实现它。当你打电话
$permission = $permissionRepository->action('abc.name');
您正在获取权限对象,因此无需在存储库中实现它。您只需要运行:
$roles = $permission->roles;
理论上,您可以将此示例添加到PermissionRepository方法中,如下所示:
public function getRoles(Permission $permission)
{
return $permission->roles;
}
所以你现在可以运行
了$roles = $permissionRepository->getRoles($permission);
获得给定权限的角色,但我没有看到这样做的任何意义。