symfony - Symfony“fos_rest.request_body”转换器:不要反序列化嵌套的 DTO 类
问题描述
我有一个带有嵌套 PointDto 类(点数组)的 OrderDto 类:
class OrderDto
{
/**
* @var PointDto[]
* @Assert\All({
* @Assert\Type("App\Dto\PointDto")
* })
* @Assert\Valid()
*/
private array $points;
// getters, setters
}
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."
}
]
}
有没有办法反序列化嵌套对象?
解决方案
我遇到了类似的问题。
我必须对一个字段使用@var 注释,它是可迭代的,因为它的类型和 ArrayCollection 作为初始化值。
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;
}
}
推荐阅读
- swift - 登录并获取访客用户 ID - Amplify auth + SwiftUI (iOS)
- reactjs - React-Admin 创建资源依赖于另一个数据
- javascript - iOs 下载 .ics 文件正在添加 .txt 扩展名
- php - 来自json文件的php echo - 未定义的索引
- python - 从 Django 模型的 IntegerField() 过滤数字系列
- python - 为什么这个循环复制最新条目而不是将其附加到列表中?
- google-apps-script - 错误消息:Google App Script to HTML 的函数 doGet
- eloquent - 如何在 eloquent 中使用数据透视表获取类别-> 名称
- php - 向 db、webservice 插入值时出错
- amazon-web-services - 不需要模块提供包 github.com/aws/aws-sdk-go/aws