Могу ли я использовать трансформаторы для преобразования данных, поступающих из API, а не из базы данных? - Laravel/Fractal

Я использую laravel для создания своих API. Я использую трансформаторы для преобразования данных из объекта модели.

Теперь вместо базы данных у меня есть ответ, исходящий из API в качестве источника данных, и я хочу преобразовать данные обратно пользователю, но я не могу этого сделать.

Мой контроллер

 public function rocByName(Request $request)
    {
        try {
            $this->roc_by_name_validator->with( $request->all() )->passesOrFail();
            $company_name = $request->input('company_name');
            $result = $this->my_service->getDetailsByName($company_name); //$result has the response object from the API which I want to transform and give it as a response.

             return $this->response->collection($result,new OnboardingTransformer()); //Tried using tranformer like this
        }
        catch (ValidatorException $e) {

            dd($e);

        }

    }

Мой трансформатор

<?php

namespace Modules\Onboarding\Transformers;

use League\Fractal\TransformerAbstract;
use App\Entities\OnboardingEntity;  //I dont have an entity since the response is coming from an API!! What will give here?

/**
 * Class OnboardingTransformerTransformer
 * @package namespace App\Transformers;
 */
class OnboardingTransformer extends TransformerAbstract
{

    /**
     * Transform the \OnboardingTransformer entity
     * @param \OnboardingTransformer $model
     *
     * @return array
     */
    public function transform(OnboardingEntity $data_source) 
    {
        return [
            'company_name'         => $data_source->company_name,
        ];
    }
}

Здесь OnboardingEntity ссылается на данные, поступающие из базы данных в идеале. Здесь я не получаю данные из базы данных, вместо этого мои данные из источника API. Как мне это сделать. Здесь я немного перепутал. Может кто-нибудь дать решение?

$result имеет следующий ответ

[
    [
        {
            "companyID": "U72400MHTC293037",
            "companyName": "pay pvt LIMITED"
        },
        {
            "companyID": "U74900HR2016PT853",
            "companyName": "dddd PRIVATE LIMITED"
        }
    ]
]

Ответ 1

$this->response->collection предназначен для получения коллекции объектов, а не массива. Затем все эти объекты преобразуются в трансформатор, который преобразует объекты OnboardingEntity по своему усмотрению. Поэтому сначала вы должны преобразовать свой входной массив в коллекцию объектов. Пример, как я сделал это выше (вы должны изменить его на свой собственный входной массив)

$data = json_decode('[
    [
        {
            "companyID": "U72400MHTC293037",
            "companyName": "pay pvt LIMITED"
        },
        {
            "companyID": "U74900HR2016PT853",
            "companyName": "dddd PRIVATE LIMITED"
        }
   ]
]');  

$data = collect( array_map( function($ob){
    return (new OnboardingEntity($ob));
}, $data[0]));

И затем передайте эту коллекцию объектов OnboardingEntity методу $this->response->collection, как здесь $this->response->collection($data,new TestTransformer());

Ответ 2

Вы можете отправить общую структуру данных в Fractal, поскольку источники данных различны. Массив - лучший возможный тип для вас.

Рассмотрим это, когда вы извлекаете данные из Eloquent (DB):

 $result = $yourModel->get(); // This will return you with a collection object.

Прежде чем передать этот объект фракталу, преобразуйте его в массив.

 $this->response->collection($result->toArray(),new OnboardingTransformer());

В случае first или одного объекта модели. перед вызовом toArray() проверьте значение null.

 $result = $yourModel->first();
 if($result){
      $result = $result->toArray(); 
 }
 // Fractal itself can handle null 

Теперь для второго сценария, где данные поступают из внешнего источника, такого как API или файл.

 $result = $this->my_service->getDetailsByName($company_name);
 // Try converting your response object to array from within

Вы можете сделать это с помощью json_decode(<Body of response>, true). Затем передайте этот массив в Fractal.

Почему массив?
Потому что источником данных может быть что угодно: от базы данных до файла, от кеша до API. Формат может быть JSON или XML. Преобразование всех этих массивов встраивается в PHP.