我正在尝试在 API 端点中反序列化 JSON 对象,但遇到了一些问题。
我正在使用 #[MapRequestPayload] 属性和默认 SerializerInterface 实现。运行 Symfony 6.4
代码如下:
用户控制器端点
#[Route('/{id}', name: 'update', methods: ['PUT'])]
#[IsGranted(UserVoter::EDIT, subject: 'user')]
public function updateUser(
#[MapEntity] User $user,
#[MapRequestPayload] UserRequest $userRequest,
): JsonResponse {
dd($userRequest);
$this->userService->updateUserByRequest($user, $userRequest);
return $this->json(
new UserResponse($user)
);
}
DTO 用户请求
readonly final class UserRequest
{
// Assert validation truncated
public string $firstName;
public string $lastName;
public ?bool $wishBirthday;
public ?\DateTimeImmutable $birthday;
public ?UserRole $role;
}
问题在于,在请求中发送时,生日和角色未正确反序列化。
当我发送此 JSON 时,我得到
422 ValidationFailedException: This value should be of type unknown.
。它甚至没有到达控制器中的 dd
调用。
{
"firstName": "Jan",
"lastName": "Mrázek",
"wishBirthday": false,
"birthDay": "2020-01-06"
}
我的问题是 - 这里到底发生了什么?我不认为这是由
#[MapRequestPayload]
直接造成的,但我怀疑 Serializer
和我的设置是罪魁祸首。
当我试图解决这个问题时,我创建了一个新项目并尝试了一个最小的示例,类似于所讨论的示例。不过这个例子运行得很好,所以我在实际项目中尝试了以下方法:
composer require symfony/serializer-pack
- 由于某种原因,安装了 1 个软件包,但只有内容哈希在我的composer.lock 文件中发生了变化property_info: ~
中删除了
framework.yaml
完全重启 symfony 服务器后,它就开始工作了。希望这可以帮助那些遇到同样问题的迷失的灵魂。