首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony "fos_rest.request_body“转换器:不反序列化嵌套的DTO类

Symfony "fos_rest.request_body“转换器:不反序列化嵌套的DTO类
EN

Stack Overflow用户
提问于 2020-02-26 16:52:01
回答 1查看 451关注 0票数 3

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

代码语言:javascript
运行
复制
class OrderDto
{
    /**
     * @var PointDto[]
     * @Assert\All({
     *     @Assert\Type("App\Dto\PointDto")
     * })
     * @Assert\Valid()
     */
    private array $points;

    // getters, setters
}

PointDto类还使用验证器约束:

代码语言:javascript
运行
复制
class PointDto
{
    /**
     * @Assert\NotBlank()
     */
    private string $address;

    // getters, setters
}

我的控制器:

代码语言:javascript
运行
复制
/**
  * @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对象的请求时,如下所示:

代码语言:javascript
运行
复制
{
    "points": [
        {
            "address": "",
            "person": {
                "name": "",
                "phone": ""
            }
        }
    ]
}

验证器无法确定类型,错误:

代码语言:javascript
运行
复制
{
  "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."
    }
  ]
}

有没有办法反序列化嵌套的对象?

EN

回答 1

Stack Overflow用户

发布于 2021-07-03 20:59:28

我也遇到过类似的问题。

我不得不对字段使用@var注释,iterable作为它的类型,ArrayCollection作为初始化值。

代码语言:javascript
运行
复制
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

class OrderDto
{
    /**
     * @var PointDto[] - this annotation is super important
     *
     * @ODM\Field
     * @Assert\All({
     *     @Assert\Type("App\Dto\PointDto")
     * })
     * @Assert\Valid()
     */
    private iterable $points;

    public function __construct()
    {
        $this->points = new ArrayCollection();
    }

    public function setPoints(iterable $points) // Don't use Collection type here, it will lead to a type error
    {
        $this->points = $points;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60410008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档