2017-03-14 4 views
1

하나의 폼에서 사용되는 여러 개의 엔터티가 추상 클래스에서 확장됩니다. 각 엔티티에 대한 양식 유형을 작성한 다음 상위 양식에 포함 시켰습니다.Symfony 임베디드 폼 유효성 검사

전자 메일 유형은 Assert \ NotBlank (기본 그룹) 및 Assert \ Email (전자 메일 그룹)에서만 "elemento"속성을 검사해야하므로 Telefono는 Assert \ NotBlank를 확인해야합니다 (그룹을 기준으로 유효성 검사를 수행하고 싶습니다. 기본 그룹) 및 Assert \ Regex (전화 그룹).

내 구성에서는 두 가지 검사 (제약 조건)가 수행되므로 전자 메일 제약 조건 AND 정규식에서 전자 메일을 검사하므로 전화가 ... 어디에서 잘못 되었습니까? 컬렉션의 이메일과 전화에

직원 엔티티는

부모 폼 그런

<?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']) 

    } 

} 

에게 어설 \ 유효() contraint

이것은 예입니다을 구성한 CBTelefonoType

당신이 CollectionType 양식 필드 (RESP에 validation_groups를 설정할 수 없습니다 AFAIK
<?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의 목적은 다른 용도 (예 : 신규 작성 vs. 기존 편집)에서는 오브젝트 속성의 제약 조건 수정을 허용하지만 위에서 설명한 내용은 허용하지 않는 것입니다. 가능한 경우 전자 메일 및 Telephono를 staff_factor (또는 StaffType_property)에서 직접 속성으로 사용하여 validation_groups를 사용하여 $ elemento를 Email 요소 한 번, Telephono 요소를 한 번 해결해야한다고 생각하십시오.

당신의 경우 해결책은 Email과 Telephono를 (AbstractElementoContact에서 상속받지 않은) 다른 클래스로 정의하고 각각에 대해 구체적인 제한을 지정하는 것입니다.

+0

대단히 감사합니다. 'validation_groups'속성은 저를 그릇 인도하고 유효성 검사를 "안내하는"데 사용될 수 있다고 생각했습니다. 다시 감사합니다. –