【问题标题】:Laravel Spatie Permissions Get a user resource with their roles and permissionsLaravel Spatie 权限获取用户资源及其角色和权限
【发布时间】:2021-05-29 03:01:49
【问题描述】:

我写作是因为我已经花费了数小时的测试来寻找问题的解决方案,但我仍然没有找到解决方法。我正在使用Spatie Laravel Permission,碰巧我有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,
        ];
    }
}

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,
            'name' => $this->name,
            '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));
}

我收到以下回复:

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

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

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

【问题讨论】:

    标签: laravel laravel-api laravel-permission laravel-resource


    【解决方案1】:

    我遇到了完全相同的问题。唯一的区别是我只想加载 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')

    中使用相同的检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 2019-09-19
      • 2020-11-01
      • 2021-10-02
      • 2020-03-31
      • 2019-08-06
      • 2014-09-15
      • 2021-04-09
      相关资源
      最近更新 更多