2016-03-31 19 views
2

Ich möchte eine E-Mail-Entität mithilfe von @Assert \ NotBlank und @Assert \ Email validieren, wenn das Kontrollkästchen aktiviert ist ($ updateEmailCheckBox). Weil jetzt diese Behauptungen in Annotationen des E-Mail-Feldes definiert sind und die Validierung auch stattfindet, wenn das Kontrollkästchen nicht aktiviert ist.Symfony: Feld validieren, wenn ein Kontrollkästchen ausgewählt ist

Hier ist der Ausschnitt aus meinen Benutzern 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 ? 
    } 
} 

Ich kann überprüfen, ob Kontrollkästchen aktiviert ist oder nicht Rückruf, aber ich kann nicht herausfinden, wie NotBlank und E-Mail-Validierungen, und im Fall, damit der Eine Constraint-Verletzung gibt entsprechende Fehler zurück.

Antwort

2

Sie können validation groups verwenden.

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

Und wenn Sie Ihre Benutzer in Ihrem Controller oder eine Dienstleistung überprüfen möchten, können Sie validieren agains diese Gruppe (wenn Checkbox aktiviert ist).

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

Standard: Enthält die Einschränkungen in der aktuellen Klasse und alle Klassen verwiesen, die zu keiner anderen Gruppe angehören.

Wenn Sie ein Formular verwenden, sollten Sie Ihr Formular so konfigurieren, dass auch Validierungsgruppen verwendet werden. Etwas wie dieses:

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

Danke! Es scheint, dass mein Ansatz völlig falsch war :) – rvaliev

Verwandte Themen