Symfony Serializer无法通过Annotations进行验证

时间:2017-11-15 10:37:18

标签: php symfony php-7

我遇到了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设置正确,但companyarray,而不是Company的对象。如果我删除了Annotations上的验证,则反序列化正确完成。

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

任何想法?

1 个答案:

答案 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.