2017-03-14 22 views
1

私は抽象クラスから継承した単一のフォームで使用される複数のエンティティを持っています。 私は各エンティティのフォームタイプを作成してから、親フォームに埋め込みました。Symfony埋め込みフォームのバリデーション

電子メールタイプはAssert \ NotBlank(デフォルトグループ)とAssert \ Email(電子メールグループ)の "elemento"プロパティをチェックする必要があり、TelefonoはAssert \ NotBlankをチェックする必要がありますデフォルトのグループ)とAssert \ Regex(電話グループ)。

私の設定では、両方のチェック(制約)が実行されるため、電子メールの制約と正規表現で電子メールがチェックされているので、電話は...どこが間違っていますか?コレクション電子メールや電話で

スタッフエンティティがアサート\有効()contraintに

を設定しているこれは

親フォームの例である

<?php 
namespace App\Form\Staff; 

class StaffType extends AbstractType { 

    public function configureOptions(OptionsResolver $resolver) { 
      $resolver->setDefaults(['data_class' => \Cowbell\Entity\Staff\Staff::class, 
        'validation_groups' => ['Default', 'email', 'phone']]); 
} 
    /** 
    * 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) { 


     // ... Other field of Staff Entity 

     ->add('emails', CollectionType::class, ['label' => 'admin.emails', 
       'entry_type' => \App\Form\Contatto\CBEmailType::class, 
       'entry_options' => ['label' => false], 
       'allow_add' => true, 
       'allow_delete' => true, 
       'empty_data' => null, 
       'translation_domain' => 'admin', 
       'validation_groups' => ['email']]) 
      ->add('telefoni', CollectionType::class, ['label' => 'admin.phones', 
       'entry_type' => \App\Form\Contatto\CBTelefonoType::class, 
       'entry_options' => ['label' => false], 
       'allow_add' => true, 
       'allow_delete' => true, 
       'empty_data' => null, 
       'translation_domain' => 'admin', 
       'validation_groups' => ['phone']]); 

    } 

} 

その後CBEmailType

<?php 
namespace App\Form\Contatto; 

class CBEmailType extends AbstractType{ 

    /** 
    * 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => \App\Entity\Contatto\Email::class, 
     'validation_groups' => ['Default', 'email']]);; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->add('elemento', EmailType::class, ['label' => 'admin.email', 
        'translation_domain' => 'admin']) 

    } 

} 

CBTelefonoType

あなたは CollectionTypeフォームフィールド(それぞれに validation_groupsを設定することはできません私の知る限り
<?php 
namespace App\Form\Contatto; 

class CBTelefonoType extends AbstractType{ 

    /** 
    * 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => \Cowbell\Entity\Contatto\Telefono::class, 
     'validation_groups' => ['Default', 'phone']]); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->add('elemento', TextType::class, ['label' => 'admin.phone', 
       'translation_domain' => 'admin']) 

    } 

} 

どちらも、メールやTELEFONOは

<?php 
namespace App\Entity\Contact; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

abstract class AbstractElementoContact { 


    /** 
    * 
    * @var string 
    * 
    * @ORM\Column(name="elemento", type="string", length=100, nullable=false) 
    * @Assert\NotBlank() 
    * @Assert\Email(strict=true, checkHost=true, checkMX=true, groups={"email"}) 
    * @Assert\Regex("/[0-9]{6,50}/", groups={"phone"}) 
    */ 
    protected $elemento; 

答えて

1

を拡張します。それを設定することはできますが、効果はありません)、コレクション内のサブフォームのセットを含むフォーム全体が、親フォーム全体にvalidation_groupsで設定されています。

validation_groupsの目的は、オブジェクトのプロパティをさまざまな目的(たとえば、新規作成と既存の編集の作成)で強制的に変更することですが、上で説明したものではできません。 あなたの現在のEmailとTelephonoをvalidation_groupsを使ってStaffオブジェクト(StaffType準拠)のプロパティとして直接使用して、$ elementoをEmail要素を一度、Telephono要素を一度解決することを考えてみましょう。

あなたの場合の解決策は、EmailとTelephonoをそれぞれ別の制約(AbstractElementoContactから継承されない)として定義することです。

+0

ありがとうございました。 'validation_groups'プロパティは私を惑わし、私はそれがバリデーションを "ガイド"するのに使用できると考えました。ありがとうございました。 –

関連する問題