现有资源的自定义操作

时间:2019-07-10 06:59:57

标签: php symfony api-platform.com

我是用于访问用户列表和仅一个用户的简单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 个答案:

答案 0 :(得分:1)

我认为最好的方法是创建一个将处理持久性部分的侦听器: 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);
        }
    }
}

我在API Platform 2.2版本中使用了类似的方法。也许您需要适应较新的版本。

或者,您可以使用自定义操作,但这似乎不是最好的方法:

https://api-platform.com/docs/core/operations/#creating-custom-operations-and-controllers