Последовательный ответ API REST в Laravel + Dingo

Я разрабатывал набор 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");

Но это, похоже, не работает, и документ не показывает завершенные шаги.

  1. В приведенном выше примере, как я могу создать шаблон для ответа об ошибке, который я могу использовать во всех моих API, и как я передам ему исключения из ошибок?
  2. Кажется, что презентатор и трансформер могут быть использованы для преобразования базы данных объекты в презентабельный JSON и ничего больше. Это правильно?
  3. Как вы используете презентатор и трансформер для ответа об успешном завершении и ответа об ошибке? Путем передачи исключений вместо объектов БД в преобразователь?

9

Решение

У меня была точно такая же проблема, и вот как я использовал динго с трансформатором

контроллер:

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

Другие решения

Я только сейчас вижу ваш похожий вопрос здесь. Так что смотрите мой ответ на ваш другой вопрос здесь: 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
}
1

Фрактал полностью документирован здесь: http://fractal.thephpleague.com/
Есть отличная книга, которую я регулярно читаю у Фила Осетрины. https://leanpub.com/build-apis-you-wont-hate Вы можете найти большинство кодов книг, доступных в github https://github.com/philsturgeon/build-apis-you-wont-hate. Вы можете найти действительно хорошие примеры Фрактала там.

  1. Я хотел бы создать контроллер Api и расширить его из моих контроллеров. Там должны быть все функции response (responseWithError, responseWithArray и т. Д.)
  2. Транформеры преобразуют объекты в согласованный формат json, чтобы все ваши конечные точки возвращали одно и то же для каждой сущности.

  3. Неужели нет ответа на этот вопрос?

  4. В документации Fractal достаточно примеров.
0
По вопросам рекламы [email protected]