Laravel Spatie Permissions 获取用户资源及其角色和权限

问题描述

我写这篇文章是因为我花了数小时的时间来寻找问题的解决方案,但我仍然没有找到解决方法。我正在使用 Spatie Laravel Permission,碰巧我有 3 个资源,一个用于 user,另一个用于 role,另一个用于 permissions。我展示了上述资源的结构:

UserResource.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,];
    }
}

RoleResource.php

class RoleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,'permissions' => PermissionResource::collection($this->whenLoaded('permissions'))
        ];
    }
}

PermissionResource.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));
}

我收到以下回复:

imagen

看关键:roles,它向我展示了permissions关系,这不是预期的结果,我希望它只有在我执行以下操作时才会向我展示该结果:

public function index()
{
    return UserResource::make(User::with(['roles.permissions','permissions'])->find(1));
}

我进行了大量测试,一切似乎都表明当我调用方法 getAllPermissions() 时也会加载 permissions 关系,这就是发生这种情况的原因。请你帮我解决这个问题。预先非常感谢您。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)