Symfony“;fos“休息.请求身体”;转换器:不反序列化嵌套的DTO类
我有一个OrderDto类和一个嵌套的PointDto类(点数组): PointDto类还使用验证器约束:Symfony“;fos“休息.请求身体”;转换器:不反序列化嵌套的DTO类,symfony,fosrestbundle,symfony-validator,Symfony,Fosrestbundle,Symfony Validator,我有一个OrderDto类和一个嵌套的PointDto类(点数组): PointDto类还使用验证器约束: class PointDto { /** * @Assert\NotBlank() */ private string $address; // getters, setters } 我的控制器: /** * @Rest\Post("/order/calc") * @ParamConverter("orderDto", convert
class PointDto
{
/**
* @Assert\NotBlank()
*/
private string $address;
// getters, setters
}
我的控制器:
/**
* @Rest\Post("/order/calc")
* @ParamConverter("orderDto", converter="fos_rest.request_body")
*/
public function calcOrder(OrderDto $orderDto, ConstraintViolationListInterface $validationErrors)
{
if (count($validationErrors) > 0)
return $this->json($validationErrors, Response::HTTP_BAD_REQUEST);
return ApiResponseUtil::okData(['sum' => 0]);
}
但当使用嵌套的dto对象发送请求时,如下所示:
{
"points": [
{
"address": "",
"person": {
"name": "",
"phone": ""
}
}
]
}
验证程序无法确定类型,错误:
{
"error": "points[0]: This value should be of type App\\Dto\\PointDto.",
"violations": [
{
"property": "points[0]",
"message": "This value should be of type App\\Dto\\PointDto."
}
]
}
有没有反序列化嵌套对象的方法?您的问题似乎在于Symfony Serializer如何解析您的点列表。当您使用
指向[]
时,它应该能够解决这个问题。您能否确保ArrayDenormalizer已在序列化程序
-服务中注册?我认为最简单的方法是将SerializerInterface注入控制器,然后将其转储。@dbrumann,很抱歉我在转储序列化程序服务中找到了这么长的答案,它是这样的:^Symfony\Component\serializer\serializer{447▼ #编码器:Symfony\Component\Serializer\encoder\ChainEncoder{425▶} #解码器:Symfony\Component\Serializer\Encoder\ChainDecoder{#376▶} #规格化器:数组:15[▼ 0=>App\Serializer\Normalizer\ConstraintViolationListNormalizer{448}…13=>Symfony\Component\Serializer\Normalizer\ArraydNormalizer{428▼ -序列化程序:Symfony\Component\serializer\serializer{447}}…]看起来至少有ArrayDenormalizer存在。这应该可以为您提供一个对象数组。我不知道还有什么可能出错。一个简单的示例项目会有所帮助。我尝试看看今天晚些时候是否可以花一个小时来研究这一点。我创建了一个带有测试用例的简单示例,效果很好。两个测试都通过了:您是否可以尝试删除验证约束并检查反序列化是否有效。这些注释可能与序列化程序推断类型的方式冲突。我发现我的错误在不存在时发生:phpDocument/reflection docblock我一安装,一切都正常
{
"error": "points[0]: This value should be of type App\\Dto\\PointDto.",
"violations": [
{
"property": "points[0]",
"message": "This value should be of type App\\Dto\\PointDto."
}
]
}