Spatie Laravel 权限。返回具有用户角色和权限的 API 资源

时间:2021-02-24 15:57:27

标签: laravel spatie laravel-api laravel-resource

我在返回 api 资源时遇到问题。我正在使用 Spatie Laravel Permission

碰巧在我的特定情况下,我试图返回一个包含用户详细信息的 api 资源,并在它们旁边显示用户拥有的角色和权限。

我的UserResorce.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')),
        ];
    }
}

我的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 文件中看到的那样,我只在真正需要时才加载 rolespermissions。这样,如果我执行以下操作:

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        return UserResource::make(User::find(1));
    }

我得到以下结果:

{
  "data": {
    "id":1,
    "name":"User Name 1",
    "email":"admin@example.com",
  }
}

所以要加载相同的结果,但这次使用与用户关联的角色,我执行以下操作:

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        return UserResource::make(User::with(['roles'])->find(1));
    }

正如预期的那样,我得到以下结果:

{
  "data": {
    "id":1,
    "name":"User Name 1",
    "email":"admin@example.com",
    "roles": {
      0: {
        "id": 1,
        "name": "Administrator",
      }
    }
  }
}

现在我的问题如下,为了获取用户角色和权限,我执行了以下操作:

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        return UserResource::make(User::with(['roles', 'permissions'])->find(1));
    }

但我在 "permissions" 键中得到一个空对象,所以我更仔细地分析,用户拥有的权限是由他们的 role 定义的,我查看了文档,我看到我可以使用 getAllPermissions() 方法获取用户的所有权限。所以我做了以下事情:

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', function () {
                return $this->getAllPermissions();
            })),
        ];
    }
}

但是通过这种方式,它也加载了角色关系中的 permissions,并且会获得如下所示的意外结果:

{
  "data": {
    "id":1,
    "name":"User Name 1",
    "email":"admin@example.com",
    "roles": {
      0: {
        "id": 1,
        "name": "Administrator",
        "permissions": {
          0: {
            "id": 1
            "name": "Create Users"
          }
        }
      }
    },
    "permissions": {
      0: {
        "id": 1,
        "name": "Create Users",
     }
  }
}

这不是预期的结果,因为我在执行时期望的结果:

return UserResource::make(User::with(['roles', 'permissions'])->find(1));

应符合以下条件:

{
  "data": {
    "id":1,
    "name":"User Name 1",
    "email":"admin@example.com",
    "roles": {
      0: {
        "id": 1,
        "name": "Administrator",
      }
    },
   "permissions": {
      0: {
        "id": 1,
        "name": "Create Users",
     }
  }
}

以及执行时:

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

我希望得到以下结果:

{
  "data": {
    "id":1,
    "name":"User Name 1",
    "email":"admin@example.com",
    "roles": {
      0: {
        "id": 1,
        "name": "Administrator",
        "permissions": {
          0: {
            "id": 1
            "name": "Create Users"
          }
        }
      }
    },
    "permissions": {
      0: {
        "id": 1,
        "name": "Create Users",
     }
  }
}

有人可以帮我解决这个问题吗?预先非常感谢您。

0 个答案:

没有答案