Я пытаюсь построить API с помощью пакета Symfony API-платформы.
Ресурс Api предлагает автоматическое действие CRUD с HTTP-глаголами POST, GET, PUT, DELETE.
Я хочу добавить конечную точку для обработки пользовательского действия POST с пользовательской полезной нагрузкой / телом, не зависящим от какого-либо ресурса.
Я блокирую это, чтобы добавить эту конечную точку в документацию по автоматической платформе API.
При поиске такого рода проблем на GitHub я обнаружил, что API-платформа v2 должна это делать.
Увидеть Выпуск № 385: Пользовательское действие + ApiDoc
Похоже, что некоторые люди находят способ использовать аннотацию NelmioApiDoc @ApiDoc.
Увидеть Выпуск № 17: Документация для пользовательской операции
С использованием @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#issuecomment-260221717
Я столкнулся с той же ситуацией, потому что я пытался поместить метод 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
Вы можете создать пользовательское действие, как это.
Сопоставить конфигурацию ресурсов с 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'];
}
}