Могу ли я использовать преобразователи для преобразования данных, поступающих из 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"
}
]
]
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());
Возможно, вы захотите отправить общую структуру данных в Fractal, поскольку источники данных различны. Массив - лучший тип для вас.
Учтите это при извлечении данных из Eloquent(DB):
$result = $yourModel->get(); // This will return you with a collection object.
Перед передачей этого объекта во фрактал конвертируйте его в массив.
$this->response->collection($result->toArray(),new OnboardingTransformer());
В случае first
или один модельный объект. проверить на ноль перед вызовом 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.