Настраиваемое действие Symfony с пакетом API Platform

Я пытаюсь создать API с помощью API-платформы Symfony.

Ресурсы Api предлагают автоматическое действие CRUD с HTTP-глаголами POST, GET, PUT, DELETE.

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

Я блокирую это, чтобы добавить эту конечную точку в документацию по автоматической платформе API.

При поиске такого рода проблем на GitHub я обнаружил, что API-платформа v2 должна это делать.

См. Выпуск № 385: пользовательское действие + ApiDoc.

Похоже, что некоторые люди находят способ использовать аннотацию NelmioApiDoc @ApiDoc.

См. Выпуск № 17: Документация для пользовательских операций

3 ответа

Решение

С использованием @ApiDoc аннотация не нужна, поддержка NelmioApiDoc будет удалена в API Platform 3 в пользу встроенной поддержки Swagger/Hydra.

Если вы используете настраиваемое действие API-платформы, это действие должно автоматически документироваться в документах Swagger и Hydra.

В любом случае, вы всегда можете настроить документы Swagger (и Hydra) для добавления пользовательских конечных точек или чего-либо еще: https://github.com/api-platform/docs/blob/master/core/swagger.md#override-swagger-documentation (эта документация будет доступна на сайте в ближайшее время).

Вы можете задокументировать свой собственный маршрут с @ApiResource() аннотация:

/**
 * @ORM\Entity
 * @ApiResource(
 *     itemOperations={
 *         "get"={"method"="GET"},
 *         "put"={"method"="PUT"},
 *         "delete"={"method"="DELETE"},
 *         "send_reset_password_token"={
 *             "route_name"="user_send_reset_password_token",
 *              "swagger_context" = {
 *                 "parameters" = {
 *                     {
 *                         "name" = "email",
 *                         "in" = "path",
 *                         "required" = "true",
 *                         "type" = "string"
 *                     }
 *                 },
 *                 "responses" = {
 *                     "201" = {
 *                         "description" = "email with reset token has been sent",
 *                         "schema" =  {
 *                             "type" = "object",
 *                             "required" = {
 *                                 "email"
 *                             },
 *                             "properties" = {
 *                                  "email" = {
 *                                     "type" = "string"
 *                                  },
 *                                  "fullname" = {
 *                                     "type" = "string"
 *                                  }
 *                             }
 *                         }
 *                     },
 *                     "400" = {
 *                         "description" = "Invalid input"
 *                     },
 *                     "404" = {
 *                         "description" = "resource not found"
 *                     }
 *                 },
 *                 "summary" = "Send email with token to reset password",
 *                 "consumes" = {
 *                     "application/json",
 *                     "text/html",
 *                  },
 *                 "produces" = {
 *                     "application/json"
 *                  }
 *             }
 *         }
 *     },
 *     attributes={
 *         "normalization_context"={"groups"={"user", "user-read"}},
 *         "denormalization_context"={"groups"={"user", "user-write"}}
 *     }
 * )
 */

Источник: https://github.com/api-platform/docs/issues/143

Вы можете создать пользовательское действие, как это. Сопоставьте конфигурацию ресурсов с yaml.

# config/packages/api_platform.yaml
api_platform:
enable_swagger_ui: false
mapping:
    paths: ['%kernel.project_dir%/config/api_platform']

Создать ресурс.yaml

# config/api_platform/resources.yaml
resources:
App\Entity\User:
  itemOperations: []
  collectionOperations:
    post:
        method: 'POST'
        path: '/auth'
        controller: App\Controller\AuthController
        swagger_context:
            summary: your desc
            description: your desc

Затем в App\Entity\User добавьте общедоступные свойства

class User {
   public $login
   public $password
}

Это все, теперь в swagger ui вы увидите метод POST /api/auth с параметрами входа и передачи.

В контроллере переопределить _invoke для выполнения вашей логики.

class AuthController {
   public function __invoke()
   {
      return ['your custom answer'];
   }
}

Я столкнулся с той же ситуацией, потому что я пытался поместить метод POST в itemOperationsхотя он может проживать только в collectionOperations, В последнем случае можно успешно определить мой собственный путь.

/**
 * @ApiResource(
 *     collectionOperations={
 *       "get"={
 *           "path"="/name_your_route",
 *       },
 *       "post"={
 *           "path"="/name_your_route",
 *       },
 *     },
 *     itemOperations={
 *       "get"={
 *           "path"="/name_your_route/group/{groupId}/user/{userId}",
 *           "requirements"={"groupId"="\d+", "userId"="\d+"},
 *       },
 *       "delete"={
 *           "path"="/name_your_route/group/{groupId}/user/{userId}",
 *       },
 *       "put"={
 *           "path"="/name_your_route/group/{groupId}/user/{userId}",
 *       }
 * })

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

И вот параграф из отличной документации об этом:

Операции по сбору действуют на набор ресурсов. По умолчанию реализованы два маршрута: POST и GET. Операции над предметами действуют на отдельный ресурс. 3 маршрута по умолчанию определены GET, PUT и DELETE

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