phplaraveltransformer-modeldingo-apithephpleague-fractal

Can I use transformers to transform data coming from API rather than from database?


I have been using laravel to build my APIs. I use transformers to tranform data from model object.

Now instead of database, I have a response coming from an API as the data source and I want to transform that data back to a user, but I am unable to do so.

My Controller

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

        }

    }

My Transformer

<?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,
        ];
    }
}

Here the OnboardingEntity refers to data coming from database ideally. Here I am not fetching data from database, instead my data is from an API source. How do I go about it. I am little consfused here. Can someone give a solution?

$result has the following response

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

Solution

  • $this->response->collection is meant to get a collection of objects, not the array. Then all of this objects is going to transformer that is transform OnboardingEntity objects as you want. So first you should transform your input array into collection of objects. The example how i did it above (you should change it to your own input array)

    $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]));
    

    And then pass this collection of OnboardingEntity objects to $this->response->collection method, like here $this->response->collection($data,new TestTransformer());