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

Я пытаюсь построить API с помощью пакета Symfony API-платформы.

Ресурс 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 (эта документация будет доступна на сайте в ближайшее время).

4

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

Вы можете задокументировать свой собственный маршрут с @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#issuecomment-260221717

2

Я столкнулся с той же ситуацией, потому что я пытался поместить метод 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

0

Вы можете создать пользовательское действие, как это.
Сопоставить конфигурацию ресурсов с 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'];
}
}
0