【问题标题】:Symfony Serializer won't work with validation over AnnotationsSymfony Serializer 不能通过 Annotations 进行验证
【发布时间】:2018-04-28 13:06:20
【问题描述】:

我遇到了序列化程序与注释验证相结合的问题。 我有一个这样的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 设置正确,但companyarray,而不是Company 的对象。如果我删除对 Annotations 的验证反序列化是正确的。

文档: https://symfony.com/doc/current/components/serializer.html#deserializing-an-object

有什么想法吗?

【问题讨论】:

    标签: php symfony php-7


    【解决方案1】:

    来自文档中的Recursive Denormalization 部分:

    当使用 Symfony 标准版时,所有规范化器都会自动配置为使用注册的提取器。单独使用组件时,PropertyTypeExtractorInterface 的实现(通常是PropertyInfoExtractor 的实例)必须作为ObjectNormalizer 的第四个参数传递。

    因此,如果您使用标准版,这应该会自动运行,所以我假设您将序列化程序作为独立版本使用。在这种情况下,您可以像这样对其进行非规范化:

    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.

    【讨论】:

    • 我确实使用的是标准版。我认为问题在于我为 DTO 的某些属性提供了默认值。一旦我删除了这些,反序列化就可以正常工作了。
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2012-06-13
    • 2014-01-12
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多