我遇到了Serializer与Annotations验证相结合的问题。 我有一个像这样的json:
{
"name": "A name",
"company": {
"name": "A company name"
}
}
我的DTO:
class DTO {
/**
* @var string
*
* @Assert\NotNull
*/
private $name;
/**
* @var Company
*
* @Assert\NotNull
*/
private $company;
public function getName(): string {
return $this->name;
}
public function setName(string $name) {
$this->name = $name;
}
public function getCompany(): Company {
return $this->company;
}
public function setCompany(Company $company) {
$this->company = $company;
}
}
// deserialization in controller
$data = $request->request->all();
$serializer->deserialize($data, DTO::class, 'json');
反序列化后,我得到一个DTO
的对象,其中属性name
设置正确,但company
是array
,而不是Company
的对象。如果我删除了Annotations上的验证,则反序列化正确完成。
文档: https://symfony.com/doc/current/components/serializer.html#deserializing-an-object
任何想法?
答案 0 :(得分:0)
来自文档中的Recursive Denormalization部分:
使用Symfony Standard Edition时,所有规范化程序都会自动配置为使用已注册的提取程序。在独立使用组件时,
PropertyTypeExtractorInterface
的实现(通常是PropertyInfoExtractor
的实例)必须作为ObjectNormalizer
的第4个参数传递。
因此,如果您使用标准版本,这应该会自动运行,因此我假设您将串行器作为独立版本使用。在这种情况下,您可以像这样对其进行非规范化:
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
$serializer = new Serializer($normalizer);
$data = $request->request->all();
$dto = $serializer->deserialize($data, DTO::class, 'json');
如果您使用的版本低于3.0:Denormalize nested structure in objects with symfony 2 serializer.