0

show()在控制器中创建了返回名称和时间戳+该角色拥有的所有权限的方法。Spatie/Laravel-Permission 负责将用户与我的 API 中的权限和角色相关联。

    public function show($name)
    {
        $role = Role::findByName($name);
        return response()->json([
            $role,
            $role->permissions
        ]);
    }

输出:

[
    {
        "name": "root",
        "created_at": "2019-04-08 19:41:49",
        "updated_at": "2019-04-08 19:41:49",
        "permissions": [
            {
                "name": "users.store"
            },
            {
                "name": "users.destroy"
            },
            {
                "name": "users.show.id"
            },
            {
                "name": "users.update.id"
            },
            {
                "name": "users.show.name"
            },
            {
                "name": "users.update.name"
            }
        ]
    },
    [
        // This is duplicate
        {
            "name": "users.store"
        },
        {
            "name": "users.destroy"
        },
        {
            "name": "users.show.id"
        },
        {
            "name": "users.update.id"
        },
        {
            "name": "users.show.name"
        },
        {
            "name": "users.update.name"
        }
    ]
]

如您所见,权限重复无用。

但是如果我从我的回复中删除 $role

        return response()->json([
//            $role,
            $role->permissions
        ]);

一切都很好

[
    [
        {
            "name": "users.store"
        },
        {
            "name": "users.destroy"
        },
        {
            "name": "users.show.id"
        },
        {
            "name": "users.update.id"
        },
        {
            "name": "users.show.name"
        },
        {
            "name": "users.update.name"
        }
    ]
]

当我只想返回 $role 而没有这样的权限时:

        return response()->json([
            $role,
//            $role->permissions
        ]);

我的输出是:

[
    {
        "name": "root",
        "created_at": "2019-04-08 19:41:49",
        "updated_at": "2019-04-08 19:41:49"
    }
]
4

2 回答 2

0

当您调用$role->permissions响应时,权限被加载到$role对象中,然后序列化为 json。所以基本上你正在发送$role具有加载权限的对象,并且你自己也在发送权限。

尝试:

public function show($name)
{
    $role = Role::findByName($name)->load('permissions');

    return response()->json([
        $role
    ]);
}
于 2019-04-08T23:09:07.850 回答
-1

你可以在这里使用 Eloquent:API 资源

public function show($name)
{
    return new RoleResource(Role::findByName($name));
}

和 RoleResource 像这样:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class RoleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'name' => $this->name,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
            'permissions' => $this-> permissions,
        ];
    }
}
于 2021-01-08T02:14:10.610 回答