Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel - How to convert API Resource to array recursively?

I'm using Laravel API Resource and want to convert all parts of my instance to an array.

In my 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')
        )
    ];
}

Then to resolve:

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

At first glance, the method resolve would fit it but the problem is that it doesn't work recursively. My resource resolved looks like:

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

How to resolve an API Resource to array recursively?

like image 305
Alexandre Thebaldi Avatar asked Sep 27 '18 14:09

Alexandre Thebaldi


1 Answers

Normally, you should just do:

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

because this is how responses should be used (of course you can do it from your controller).

However if there is any reason you want to do it manually you can do:

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

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

I'm not sure if this is exact effect you want, but you can get also other information from $jsonResponse if you need. And result of ->getData() is object.

You can also use:

echo $jsonResponse->getContent();

if you need to just get string

like image 164
Marcin Nabiałek Avatar answered Oct 20 '22 18:10

Marcin Nabiałek