2016-05-23 9 views
1

カスタムプロパティパスで定義されたフィールドのエラーマッピングに問題があります。次のように私の状況は次のとおりです。Symfonyフォーム:カスタムproperty_pathを使用したフィールドのエラーマッピング

フォームタイプ:

class MyFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add(
      'aField', 
      TextType::class, 
      ['property_path' => 'anObject.aProperty'] 
     ); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 'data_class' => FormData::class ]); 
    } 
} 

フォームデータクラス:

class FormData 
{ 
    /** 
    * @var MyObject 
    * @Assert\Valid 
    */ 
    public $anObject; 
} 

フォームデータがネストされたオブジェクト:

class MyObject 
{ 
    /** 
    * @var string 
    * @Assert\NotBlank 
    */ 
    public $aProperty; 

    // NOTE: this object has other properties that are not mapped by my form and I'm not listing here for the sake of brevity. 
} 

私の問題があります次のようになります。aPropertyに違反が発生した場合、違反パスはdata.anObject.aPropertyです。エラーはフォームフィールドaFieldに自動的にはマッピングされません。私はこれが "バニラ"検証の観点から正しいと理解していますが、正しいフィールドにフォームエラーを付けるために、property_path属性に基づいてマッピングを調整するフォームレベルの翻訳レイヤーが必要です。私はerror_mappingオプションでジャグリングを試みましたが、それはそれが作られたものではないことが判明しました。

私はこれを「デフォルト」の動作として期待していますか?あなたはこれがバグと見なされると思いますか、あるいは少なくとも要求する価値のある機能要求ですか?誰かが同様の状況に陥って解決策を見つけたのでしょうか?

+0

'aField'は何ですか?それは 'anObject'マッピングですか?それは明らかではないようです。 – DonCallisto

+0

以下のクラスにあるように、 'aField'は' anObject'の 'aProperty'にマップされます。それ自体はフォームデータクラスのプロパティです。 –

+0

がマップされています...どこですか?あなたのクラスで 'aField'が表示されません:)その意味は – DonCallisto

答えて

0

同じ問題がありました。アンケートには$ userというプロパティがあります

ユーザーはレジデンシーとOneToManyの関係にあります。

ユーザーの最初のResidency in Questionnaireタイプにデータを提出しなければならなかったので、最初のユーザーのレジデンス(user.residencies [0])へのproperty_pathでフィールド 'residency'を追加しました。その後、私はerror_mappingでルートフォームのオプションを追加する必要がありました。レジデンシーエラーは 'レジデンシー'タイプ( 'user.residencies' => 'residency')になります。

ちょうどの場合 - アンケート実体には、プロパティ "residency"がありません

私の解決策があります:

<?php 

class QuestionnaireType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('residency', 'residency', [ 
       'data_class' => Residency::class, 
       'property_path' => "user.residencies[0]", 
      ]) 
     ; 
    } 

    public function getName() 
    { 
     return 'questionnaire_form'; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => Questionnaire::class, 
       'cascade_validation' => true, 
       'error_mapping' => [ 
        'user.residencies' => 'residency' 
       ], 
      ) 
     ); 
    } 
} 
関連する問題