laravel - Laravel Spatie 权限获取用户资源及其角色和权限
问题描述
我正在写作,因为我已经花费了数小时的测试来寻找问题的解决方案,但我仍然没有找到解决方法。我正在使用Spatie Laravel 权限,碰巧我有 3 个资源,一个用于user
,另一个用于role
,另一个用于permissions
。我展示了上述资源的结构:
用户资源.php
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'roles' => RoleResource::collection($this->whenLoaded('roles')),
'permissions' => PermissionResource::collection($this->whenLoaded('permissions', $this->getAllPermissions())),
'active' => $this->active,
];
}
}
角色资源.php
class RoleResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'permissions' => PermissionResource::collection($this->whenLoaded('permissions'))
];
}
}
权限资源.php
class PermissionResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name
];
}
}
正如您在我的UserResource.php
文件中看到的那样,我正在定义一个结构以仅在需要时显示用户角色和权限。您还可以看到,在permissions
密钥中,我不仅返回与用户关联的权限,而是返回与用户直接关联并与他们拥有的角色关联的所有权限getAllPermissions()
。
现在看RoleResource.php
文件,我定义的是与角色关联的权限仅在必要时才会显示,这就是我的问题。当我执行以下操作时:
public function index()
{
return UserResource::make(User::with(['roles', 'permissions'])->find(1));
}
我收到以下回复:
看看 key: roles
,它向我展示了permissions
关系,这不是预期的结果,我希望它只有在我执行以下操作时才会向我展示该结果:
public function index()
{
return UserResource::make(User::with(['roles.permissions', 'permissions'])->find(1));
}
我一直在做很多测试,一切似乎都表明当我调用该方法时getAllPermissions()
也会加载permissions
关系,这就是发生这种情况的原因。请你帮我解决这个问题。非常感谢您提前。
解决方案
我遇到了完全相同的问题。唯一的区别是我只想加载 1 个角色,因为我的用户永远只有一个角色。我是如何解决的:
在 UserResource.php 中
$user = [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'role' => $this->roles[0]->name,
];
if ($this->relationLoaded('permissions')) {
$user['permissions'] = PermissionResource::collection($this->getAllPermissions());
}
return $user;
然后在 UserController.php 中:
new UserResource(User::load('permissions')->get());
我不知道这是否正确,但这是我目前发现解决此问题的唯一方法。这对我有用,因为我总是只想看到我的用户的角色名称。我想对于您的问题,您可以在 RoleResource.php 中使用相同的检查$this->relationLoaded('roles.permissions')
推荐阅读
- python - Windows 中带有 mod_wsgi 和 Apache 的 Python mod(-m) 选项
- google-kubernetes-engine - 具有跨集群百分比流量的多集群 Kubernetes
- java - 如何在 Eclipse/Spring 工具套件中调试 Serenity BDD 故事
- three.js - 如何使参数范围依赖于 Three.js 中的 dat.GUI
- python - 如何在不影响信任令牌的情况下使用硒?
- c# - 如何在 Asp.net C# 中从数据库中获取 Guid ID?
- angular - 使用波形工具时角度材料垫滑动切换空表单标签问题
- azure-data-factory - 从 Datafactory 在 VM 上调用“运行命令”的规范方法?
- javascript - 递归异步函数内存泄漏
- c# - 添加了SharpFont nuget,但未找到对Assembly 的引用