如何解决Spatie Laravel 权限返回具有用户角色和权限的 API 资源
我在返回 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,'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
文件中看到的那样,我只在真正需要时才加载 roles
和 permissions
。这样,如果我执行以下操作:
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,"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,'permissions' => PermissionResource::collection($this->whenLoaded('permissions',function () {
return $this->getAllPermissions();
})),];
}
}
但是通过这种方式,它也加载了角色关系中的 permissions
,并且会获得如下所示的意外结果:
{
"data": {
"id":1,"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,}
},}
}
}
以及执行时:
return UserResource::make(User::with(['roles.permissions','permissions'])->find(1));
我希望得到以下结果:
{
"data": {
"id":1,}
}
}
有人可以帮我解决这个问题吗?预先非常感谢您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。