2017-11-15 18 views
1

シノニザとアノテーションの検証との組み合わせで問題が発生しました。 私はこのようなJSONを得た:Symfonyシリアライザはアノテーションでの検証では機能しません

{ 
    "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'); 

デシリアライゼーションの後、私は、プロパティnameDTOのオブジェクトが正しく設定され得るが、companyarrayCompanyのではないオブジェクトであります。注釈を介してバリデーションを削除すると、デシリアライズが正しく行われます。

ドキュメント: https://symfony.com/doc/current/components/serializer.html#deserializing-an-object

任意のアイデア?ドキュメントのRecursive Denormalizationセクションから

答えて

0

symfonyの標準版を使用して、すべての正規化は自動的に登録エクストラクタを使用するように構成されています。スタンドアロンのコンポーネントを使用する場合は、の実装(通常はPropertyInfoExtractorのインスタンス)をObjectNormalizerの4番目のパラメータとして渡す必要があります。

したがって、標準版を使用している場合は自動的に動作するはずです。したがって、シリアライザをスタンドアロンとして使用していると仮定しています。あなたが3.0以下のバージョンを使用している場合は

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'); 

Denormalize nested structure in objects with symfony 2 serializer.

+0

私は確かに標準版を使用していたこのケースでは、そのようにそれを非正規化することができます。問題は、私がDTOの私の属性のいくつかのためにデフォルト値を提供したことだと思います。これらを削除すると直ちに、デシリアライズが正常に機能しました。 – Marco

関連する問題