Laravel JsonResource (resource collection) 添加额外数据到响应

Laravel JsonResource (resource collection) add extra data to response

我正在使用 laravel (v7) 资源,我有一个扩展 JsonResource 的资源,我通过分页从控制器调用这个资源。我想在 data 数组旁边添加附加属性 extra,如下所示:

{
    "data": [
    ],
    "links": {
    },
    "meta": {
    },
    "extra": {
        ....
    }
}

JsonResource 的问题在于它们无法使用方法 with。我尝试将以下内容添加到我的资源 collection 但没有任何区别。

    public function with($request)
    {
        return [
            'extra' => [
                'key' => 'value',
            ],
        ];
    }

到目前为止,我发现唯一可行的方法是从链接到资源本身的控制器中调用 additional() 方法,例如:

return (new UserCollection(User::all()->load('roles')))
                ->additional(['extra' => [
                    'key' => 'value',
                ]]);

但我想从资源本身添加一些数据,而这些额外数据在控制器中不可用。有办法吗?

编辑: 这是我的资源 collection

class UserCollection extends JsonResource
{

    protected $result = [];


    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        $this->result = [
            
            "attributes" =>[
                 "id"                   => $this->id,
                'name'                  => $this->name,
                'position'              => $this->position,
            ],
        ] ;

        return $this->result;
    }


    public function with($request)
    {
        return [
            'extra' => [
                'key' => 'value',
            ],
        ];
    }

}

控制器是这样调用的

$users = User::where('is_available', 1)->get();

$users = $users->paginate();    

return UserCollection::collection($users);

通过 运行 php artisan make:resource userphp artisan make:resource userCollection.

在两个文件中创建 JsonResourceResourceCollection

您将在同一个文件夹中有两个单独的文件,user.phpuserCollection.php

使用 user.php 这是 JsonResource 自定义您的属性并使用 userCollection.php

供参考https://laravel.com/docs/9.x/eloquent-resources#resource-collections