2016-03-31 17 views
2

チェックボックスがオンの場合(@ updateEmailCheckBox)に限り、@Assert \ NotBlankと@Assert \ Emailを使用してメールエンティティを検証します。 これらのアサートは電子メールフィールドの注釈で定義されているため、チェックボックスがオンになっていない場合でも検証が行われます。ここでSymfony:チェックボックスが選択されているときにフィールドを検証します

は私のユーザーenityの抜粋です:

/** 
* Update email checkbox entity 
*/ 
private $updateEmailCheckBox; 

/** 
* @var string 
* @Assert\NotBlank(message="Email can't be empty") 
* @Assert\Email(message="Wrong email pattern") 
*/ 
private $email; 

/** 
* @Assert\Callback 
*/ 
public function validate(ExecutionContextInterface $context) 
{ 
    /** 
    * If update email checkbox is checked 
    */ 
    if ($this->getUpdateEmailCheckBox() == 1) 
    { 
     // how to validate here an email field for Assert\NotBlank and Assert\Email ? 
    } 
} 

私はチェックボックスは、コールバックを使用してチェックされているかどうかを確認することができますが、私はNotBlankや電子メールの検証を有効にする方法を見つけ出すことはできません、との場合、制約違反は対応するエラーを返します。

答えて

2

validation groupsを使用できます。

/** 
* @Assert\NotBlank(groups={"updateEmail"}) 
* @Assert\Email(groups={"updateEmail"}) 
*/ 
private $email; 

あなたのコントローラまたはサービスでユーザを検証する場合は、このグループを再度検証します(チェックボックスがオンの場合)。

$errors = $validator->validate($user, null, array('Default', 'updateEmail')); 

デフォルト: は、現在のクラス内の制約なし、他のグループに属するすべての参照クラスが含まれています。

フォームを使用している場合は、検証グループを使用するようにフォームを設定する必要があります。このようなもの:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'validation_groups' => function (FormInterface $form) { 
      $data = $form->getData(); 


      if (/* checkbox is checked */) { 
       return array('Default', 'updateEmail'); 
      } 

      return array('Default'); 
    }, 
    )); 
} 
+0

ありがとうございました!私のアプローチは完全に間違っているようです:) – rvaliev

関連する問題