mercredi 4 juillet 2018

Convert third party API data in Laravel 5.6 collection resource

I've been working on creating a clean interface for our various web application and I've run into a snag with Laravel's API Resources not properly converting the incoming json array into laravel collections.

I can do it with a single resource:

    namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;
use App\Product;

class ProductResource extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'name' => $this->resource['product']['name'],
            'description' => $this->resource['product']['description'],
            'price' => $this->resource['product']['rental_rate']['price']
        ];

        //return parent::toArray($request);
    }
}

print this response outputs:

{"name":"Arri Skypanel S60-C","description":"Arri Sky Panel S60-C 450w input with a 2000w tungsten equivalent & Combo Stand","price":"260.0"}

However trying to take this single item and turn it into a collection of items isn't going anywhere.

Anybody got a clue what I'm missing?

Pulling the API data looks like this:

namespace App;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;

class ThirPartyAPI
{
    private $url = 'https://api.third-party.com/api/v1/';

    public function pull($query, $additionalParams) {
        $client = new Client;
        $result = $client->get($this->url . $query . $additionalParams, [
            'headers' => [
                'Content-Type' => 'application/json',
                'X-AUTH-TOKEN' => env('CURRENT-AUTH-TOKEN'),
                'X-SUBDOMAIN' => env('CURRENT-SUBDOMAIN')
            ]
        ]);
        $array = json_decode($result->getBody()->getContents(), true);

        return $array;
    }
}

The API returns a lot of json data.

This is the Product model:

public function getAllProducts() {
        try {

            $productData = [];  
                $query = "/products?page=1&per_page=3&filtermode=active";
                $additionalParams = "";
                $productData = new ThirdPartyAPI;
                $productData = $productData->pull($query, $additionalParams);

                $productData = $productData['products'];    

        return ProductsResource::make($productData);
    } catch (\Exception $ex) {
        return $ex;
    } catch (\Throwable $ex) {
        return $ex;
    }

} 

Right now I'm trying something this to convert all the returned arrays into something I can control more:

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class ProductsResource extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'products' => $this->collection->mapInto(function($request) {
               return[ 'name' => $this->resource['name'],
                       'description' => $this->resource['description'],
                       'price' => $this->resource['rental_rate']['price']
                ];
            })
        ];

    }

However var_dumping the data just returns this:

object(App\Http\Resources\ProductsResource)[200]
  public 'resource' => 
    array (size=3)
      0 => 
        array (size=37)
          'id' => int 164
          'name' => string '10A Dimmer' (length=10)
          [Lots of data]
              ...
          'sale_rates' => 
            array (size=0)
              ...
      1 => .....
      [cont]
 public 'with' => 
    array (size=0)
      empty
  public 'additional' => 
    array (size=0)
      empty

I've tried various forms of data conversion on the return json info and haven't had a lot of results except errors and confusing business. I'm a little shady on how Laravel handles API Resource handling.



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire