Laravel — Как рекурсивно конвертировать API Resource в массив?

Я использую Laravel Ресурс API и хочу преобразовать все части моего экземпляра в массив.

В моем PreorderResource.php:

/**
* Transform the resource into an array.
*
* @param  \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'exception' => $this->exception,
'failed_at' => $this->failed_at,
'driver' => new DriverResource(
$this->whenLoaded('driver')
)
];
}

Затем решить:

$resolved = (new PreorderResource(
$preorder->load('driver')
))->resolve();

На первый взгляд, метод разрешить подходит, но проблема в том, что он не работает рекурсивно. Мой разрешенный ресурс выглядит так:

array:3 [
"id" => 8
"exception" => null
"failed_at" => null
"driver" => Modules\User\Transformers\DriverResource {#1359}
]

Как разрешить ресурс API для рекурсивного массива?

1

Решение

Обычно вы должны просто сделать:

Route::get('/some-url', function() {
$preorder = Preorder::find(1);
return new PreorderResource($preorder->load('driver'))
});

потому что это то, как ответы должны быть использованы (конечно, вы можете сделать это с вашего контроллера).

Однако, если есть какая-то причина, по которой вы хотите сделать это вручную, вы можете сделать:

Route::get('/some-url', function() {
$preorder = Preorder::find(1);
$jsonResponse = (new PreorderResource($preorder->load('driver')))->toResponse(app('request'));

echo $jsonResponse->getData();
});

Я не уверен, что это именно тот эффект, который вы хотите, но вы также можете получить другую информацию от $jsonResponse если тебе надо. И результат ->getData() это объект.

Вы также можете использовать:

echo $jsonResponse->getContent();

если вам нужно просто получить строку

1

Другие решения

Вы пробовали toArray() метод?

$resolved = (new PreorderResource(
$preorder->load('driver')
))->toArray();
-1

По вопросам рекламы [email protected]