Я разрабатывал набор API для отдыха, которые будут доступны для мобильных приложений. Я следую шаблону репозитория для разработки проекта Laravel. Как реализовать презентатор и преобразователь для форматирования постоянного вывода JSON во всем наборе всех моих API?
Например у меня есть следующий контроллер для входа
public function authenticate()
{
$request = Request::all();
try {
// If authenticated, issue JWT token
//Showing a dummy response
return $token;
} catch (ValidatorException $e) {
return Response::json([
'error' =>true,
'message' =>$e->getMessageBag()
]);
}
}
Теперь, где трансформер и ведущий входят в картину? Я знаю, что оба используются для форматирования выходных данных путем преобразования объекта db и создания отформатированного JSON, чтобы он оставался одинаковым для всех моих API.
API динго и фрактал или даже фреймворк (Хранилище L5) не предоставлять подробную документацию, и я не могу найти учебники по этому вопросу.
Я создал следующий ведущий и трансформер для другой API, который дает список продуктов
namespace App\Api\V1\Transformers;
use App\Entities\Product;
use League\Fractal\TransformerAbstract;
class UserTransformer extends TransformerAbstract {
public function transform(\Product $product)
{
return [
'id' => (int) $product->products_id
];
}
}
Ведущий
<?php
namespace App\Api\V1\Presenters;
use App\Api\V1\Transformers\ProductTransformer;
use Prettus\Repository\Presenter\FractalPresenter;
/**
* Class ProductPresenter
*
* @package namespace App\Presenters;
*/
class ProductPresenter extends FractalPresenter
{
/**
* Transformer
*
* @return \League\Fractal\TransformerAbstract
*/
public function getTransformer()
{
return new UserTransformer();
}
}
Как я буду устанавливать докладчика в контроллере и отвечать обратно? Пытался
$this->repository->setPresenter("App\\Presenter\\PostPresenter");
Но это, похоже, не работает, и документ не показывает завершенные шаги.
У меня была точно такая же проблема, и вот как я использовал динго с трансформатором
контроллер:
public function update(Request $request)
{
$bus = new CommandBus([
$this->commandHandlerMiddleware
]);
$agency = $bus->handle(
new UpdateAgencyCommand($request->user()->getId(), $request->route('id'), $request->only('name'))
);
return $this->response->item($agency, new AgencyTransformer());
}
Трансформатор:
class AgencyTransformer extends TransformerAbstract
{
public function transform(AgencyEntity $agencyEntity)
{
return [
'id' => (int) $agencyEntity->getId(),
'name' => $agencyEntity->getName(),
];
}
}
и вот как я обрабатываю ошибки:
throw new UpdateResourceFailedException('Could not update agency.', $this->agencyUpdateValidator->errors());
Я только сейчас вижу ваш похожий вопрос здесь. Так что смотрите мой ответ на ваш другой вопрос здесь: https://stackoverflow.com/a/34430595/429719.
Из другого вопроса, который я получил, вы используете Dingo
, так что используйте это как класс структурированных ответов. Убедитесь, что ваш контроллер простирается от Dingo
и тогда вы можете просто возвращать элементы и коллекции в структурированном виде, как:
return $this->response->item($user, new UserTransformer);
return $this->response->collection($users, new UserTransformer);
Если вам нужна хорошая обработка ошибок, посмотрите документы здесь: https://github.com/dingo/api/wiki/Errors-And-Error-Responses
В основном вы можете бросить любое из основных исключений или несколько пользовательских Dingo
из них. Слой Dingo поймает их и возвратит структурированный ответ JSON.
Согласно Dingo Docs:
throw new Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Nope, no entry today!');
Будет генерировать:
{
"message": "Nope, no entry today!",
"status_code": 403
}
Фрактал полностью документирован здесь: http://fractal.thephpleague.com/
Есть отличная книга, которую я регулярно читаю у Фила Осетрины. https://leanpub.com/build-apis-you-wont-hate Вы можете найти большинство кодов книг, доступных в github https://github.com/philsturgeon/build-apis-you-wont-hate. Вы можете найти действительно хорошие примеры Фрактала там.
Транформеры преобразуют объекты в согласованный формат json, чтобы все ваши конечные точки возвращали одно и то же для каждой сущности.
Неужели нет ответа на этот вопрос?