Платформа API - как использовать DTO для публикации?

Я использую платформу API в своем приложении Symfony4, чтобы раскрыть свои ресурсы. Это отличный фреймворк, но он вынуждает вас по умолчанию иметь всю вашу бизнес-логику на стороне интерфейса, потому что он предоставляет все ваши сущности, а не бизнес-объект.

Мне это не нравится, и я предпочитаю, чтобы моя бизнес-логика находилась на стороне сервера.

Мне нужно создать пользователей, но есть разные типы пользователей. Итак, я создал UserFactory на внутренней стороне. Таким образом, передняя часть просто должна подтолкнуть бизнес-объект, а серверная часть позаботится обо всем.

Передний фронт никогда не может сохранять пользовательский объект непосредственно в БД. Это роль серверной части

Следуя этому руководству по использованию DTO для чтения: https://api-platform.com/docs/core/dto/#how-to-use-a-dto-for-reading

Я пытаюсь сделать то же самое для публикации. И это работает. Вот мой код контроллера:

/**
 * @Route(
 *     path = "/create/model",
 *     name = "create-model",
 *     methods = {"POST"},
 *     defaults = {
 *          "_api_respond"=true,
 *          "_api_normalization_context" = {"api_sub_level"=true},
 *          "_api_swagger_context" = {
 *              "tags" = {"User"},
 *              "summary" = "Create a user Model",
 *              "parameters" = {
 *                  
 *              },
 *              "responses" = {
 *                  "201" = {
 *                      "description" = "User Model created",
 *                      "schema" = {
 *                          "type" = "object",
 *                          "properties" = {
 *                              "firstName" = {"type" = "string"},
 *                              "lastName" = {"type" = "string"},
 *                              "email" = {"type" = "string"},
 *                          }
 *                      }
 *                  }
 *              }
 *          }
 *     }
 * )
 * @param Request $request
 * @return \App\Entity\User
 * @throws \App\Exception\ClassNotFoundException
 * @throws \App\Exception\InvalidUserException
 */
public function createModel(Request $request)
{
    $model = $this->serializer->deserialize($request->getContent(), Model::class, 'json');
    $user = $this->userFactory->create($model);
    $this->userRepository->save($user);

    return $user;
}

Он отлично работает, но мне бы хотелось, чтобы мой новый ресурс работал в пользовательском интерфейсе Swagger, поэтому я могу создавать с помощью метода POST новые ресурсы прямо в веб-интерфейсе.

Для этого, я думаю, мне нужно заполнить раздел параметров в моем _api_swagger_context. Но у меня нет никаких документов по этому поводу.

Как я могу это сделать?

«по умолчанию, чтобы вся ваша бизнес-логика находилась на стороне внешнего интерфейса…» Это неправда, вы можете выполнять бизнес-логику внутри события symfony / doctrine.

Iwan Wijaya 19.11.2018 03:30

@IwanWijaya Я знаю. Я просто говорю о бизнес-объекте.

Kevin 19.11.2018 14:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
2
3 573
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел ответ здесь: https://github.com/api-platform/docs/issues/666

Вы можете заполнить такие параметры:

 "parameters" = {
     {
        "name" = "data",
        "in" = "body",
        "required" = "true",
        "schema" = {
            "type" = "object",
            "properties" = {
                 "firstName" = {"type" = "string"},
                 "lastName" = {"type" = "string"},
                 "email" = {"type" = "string" }
             }
         },
     },
 },

Больше документов о параметрах чванства здесь: https://swagger.io/docs/specification/2-0/describing-parameters/

Другие вопросы по теме