11

我一直在使用 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"
        }
    ]
]
4

2 回答 2

2

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

于 2017-07-13T09:17:06.040 回答
2

由于数据源不同,您可能希望将通用数据结构发送到 Fractal。数组是最适合您的类型。

当您从 Eloquent(DB) 获取数据时请考虑这一点:

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

在将此对象传递给分形之前将其转换为数组。

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

first或单个模型对象的情况下。在调用之前检查 null toArray()

 $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 内置的。

于 2017-07-14T05:37:23.000 回答