Как преобразовать сторонние данные API в ресурс для сбора в Laravel 5.6? - PullRequest
0 голосов
/ 04 июля 2018

Я работал над созданием чистого интерфейса для нашего различного веб-приложения, и я столкнулся с проблемой с Ресурсами API Laravel, которая неправильно конвертирует входящий массив json в коллекции laravel.

Я могу сделать это с одним ресурсом:

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

распечатать этот ответ:

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

Однако попытка взять этот единственный предмет и превратить его в коллекцию предметов никуда не денется.

Кто-нибудь понял, что мне не хватает?

Получение данных API выглядит следующим образом:

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;
    }
}

API возвращает много данных json.

Это модель продукта:

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;
    }

} 

Сейчас я пытаюсь что-то сделать, чтобы преобразовать все возвращенные массивы во что-то, что я могу контролировать больше:

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

    }

Однако var_dumping данных просто возвращает это:

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

Я пробовал различные формы преобразования данных в возвращаемой информации json, и у меня не было большого количества результатов, кроме ошибок и сбивающего с толку бизнеса. Я немного сомневаюсь в том, как Laravel обрабатывает обработку ресурсов API.

1 Ответ

0 голосов
/ 05 июля 2018

Хорошо, после некоторого изучения методов Laravel 'make', 'mapinto' и 'map' для коллекций, я в итоге получил рабочий результат этого преобразования здесь:

$productData = ThirdPartyAPI;
$productData = $productData->pull($query, $additionalParams);
$productData = $productData['products'];

$products = collect($productData)->map(function($row){
      return ProductsResource::make($row)->resolve();
});
var_dump($products);

Это var_dump возвращает это:

object(Illuminate\Support\Collection)[228]
  protected 'items' => 
    array (size=3)
      0 => 
        array (size=3)
          'name' => string '10A Dimmer' (length=10)
          'description' => string '10amp Dimmer (Max 2.4k)' (length=23)
          'price' => string '5.0' (length=3)
      ....
        [And so on]

Исходная информация, которая была возвращена, была многомерным массивом.

$returnedArray = array(
    ['array' => 1, 'name' => 'name', etc],
    ['array' => 2, 'name' => 'name, etc]
);

Метод сбора по умолчанию в Laravel превращает только верхний массив в коллекцию. Чтобы должным образом иметь возможность контролировать результаты с помощью моделей ресурсов, мы должны преобразовать весь набор массивов в коллекции, что означает, что нам нужно перебирать возвращаемые данные, чтобы преобразовать их во что-то, что laravel может правильно читать. Это то, что делает метод карты.

В соответствии с документами it, «метод map выполняет итерацию по коллекции и передает каждое значение данному обратному вызову. Функция обратного вызова может свободно изменять элемент и возвращать его, тем самым формируя новую коллекцию измененных элементов '

метод make создает новый экземпляр коллекции. Я не знаю, что делает функция разрешения, за исключением того, что в документах упоминается, что она "разрешает данный класс или имя интерфейса в своем экземпляре с использованием сервисного контейнера". Я собираюсь предположить, что это означает, что он гарантирует, что проходит через класс правильно?

В любом случае, я надеюсь, что это поможет людям в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...