Laravel - Как рекурсивно конвертировать API Resource в массив? - PullRequest
0 голосов
/ 27 сентября 2018

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

По моему 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();

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

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

Как преобразовать ресурс API в рекурсивный массив?

1 Ответ

0 голосов
/ 27 сентября 2018

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

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();

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

...