我是用于访问用户列表和仅一个用户的简单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平台的所有机制...
通常,如何在同一资源上保存多个更新?
你有什么主意吗?
答案 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