Пользовательская операция с существующим ресурсом - PullRequest
1 голос
/ 10 июля 2019

Я был простой конфигурацией ресурса api-платформы для доступа к списку пользователей и только одного пользователя:

  App\Entity\User:
    collectionOperations:
      get: ~
    itemOperations:
      get: ~

Эта конфигурация генерирует 2 маршрута:

/GET /api/users
/GET /api/users/{id}

Один элементUser, которые представляют учетную запись пользователя и связанное физическое лицо:

{
  "id": 0,
  "username": "string",
  "email": "string",
  "person": {
    "id": 0,
    "civility": "string",
    "lastName": "string",
    "firstName": "string",
    "language": "string",
    "fullName": "string"
  }
}

Затем я хочу обновить определенное поле моей учетной записи: пароль

/PUT /api/users/{id}/updatePassword
{
  "password": "string",
  "confirmPassword": "string"
}

Моя текущая api-платформаконфигурация для этого маршрута:

  App\Resource\DTOs\UpdatePassword:
    collectionOperations: []
    itemOperations:
      put:
        method: 'PUT'
        path: '/users/{id}/updatePassword'
        requirements:
          id: '\d+'
        swagger_context:
          tags: ['User']
          summary: Update user account password

namespace App\Resource\DTOs;

class UpdatePassword
{
    /** @var string */
    public $password;

    /** @var string */
    public $confirmPassword;
}

Проблема в том, что мои DTO не знают, что нужно обновить пользователя.Как указать, что он связан с пользовательским ресурсом?Я пытался с событиями API-платформы, но я не знаю, когда действовать.

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

А вообще как сохранить несколько обновлений на одном ресурсе?

Есть идеи?

1 Ответ

1 голос
/ 10 июля 2019

Я думаю, что лучший способ - создать слушателя, который будет обрабатывать постоянную часть: https://api -platform.com / docs / core / events /

class UpdatePasswordPersistSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::VIEW => [['persist', EventPriorities::PRE_WRITE]],
        ];
    }

    public function persist(GetResponseForControllerResultEvent $event)
    {
        $object = $event->getControllerResult();
        $method = $event->getRequest()->getMethod();

        if ($object instanceof UpdatePassword && $method === Request::METHOD_PUT) {
            // todo: persist

            // Set the result in response if needed
            // $event->setControllerResult($result);
        }
    }
}

Iиспользуйте нечто подобное в версии API Platform 2.2.Возможно, вам нужно адаптироваться к более новой версии.

В качестве альтернативы вы можете использовать пользовательскую операцию, но это не кажется лучшим способом:

https://api -platform.com / docs /ядро / операция / # создание-таможенно-операция-и-контроллеры

...