Symfony“;fos“休息.请求身体”;转换器:不反序列化嵌套的DTO类

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

我有一个OrderDto类和一个嵌套的PointDto类(点数组):

PointDto类还使用验证器约束:

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."
    }
  ]
}