Ресурс API Laravel может быть отдельным ресурсом или коллекцией.В некоторых случаях дополнительные параметры необходимо передать в ресурс / коллекцию от контроллера.Ниже приведен простой пример, демонстрирующий проблему с использованием User
в качестве отдельного ресурса / ресурса коллекции и настраиваемого параметра $apple
, который передается ресурсу для вывода.Проблема может быть замечена в окончательном Output (Collection)
ниже, где для значения fruit
мы получаем неправильное значение banana
для первого пользователя вместо правильного значения apple
(которое получают все другие пользователи),Он отлично работает для одного выхода, но не для коллекции.См. Ниже:
Контроллер с UserResource (Single)
$user = User::first();
return new UserResource($user, $apple = true); // $apple param passed
Контроллер с UserResource (Collection)
$users = User::limit(3)->get();
return UserResource::collection($users, $apple = true); // $apple param passed
UserResource
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource {
private $apple;
public function __construct($resource, $apple = false) {
// Ensure we call the parent constructor
parent::__construct($resource);
$this->resource = $resource;
$this->apple = $apple; // $apple param passed
}
public function toArray($request) {
return [
'id' => (int) $this->id,
'name' => $this->name,
'fruit' => $this->apple ? 'apple' : 'banana',
];
}
}
Выход (одиночный)
{
"data": {
"id": 1,
"name": "Peter",
"fruit": "apple" // correct param!
}
}
Выход (сборник)
{
"data": [
{
"id": 1,
"name": "Peter",
"fruit": "banana" // INCORRECT param!
},
{
"id": 2,
"name": "Lois",
"fruit": "apple" // correct param!
},
{
"id": 3,
"name": "Brian",
"fruit": "apple" // correct param!
}
]
}
Обратите внимание, что это всего лишь пример, это может быть любое количество случайных параметров (не связанных с коллекцией User
, но они должны быть переданы для логики вывода), например одно значение read_at
отметка времени издругую таблицу, которую я хочу передать один раз, и выполнить некоторую логику для нее в коллекции ресурсов перед выводом (например, сравнение с пользовательской меткой времени), или другие параметры, переданные для дополнительной логики if/else
, которая должна быть выполнена в файле ресурсов в целом дляманипулировать выводом коллекции.Как это можно сделать?