2013-05-03 9 views
5

Szukam informacji, jeśli jest jakaś flaga/opcja, która wymusza walidację symfony2 przy pierwszym błędzie w łańcuchu sprawdzania poprawności. Na przykład mam trzy weryfikatorów na moim email polu:Zatrzymaj sprawdzanie poprawności dla pierwszej flagi błędu w Symfony2?

email: 
    - NotBlank: { groups: [ send_activation_email ] } 
    - Length: { min: 6, max: 80, charset: UTF-8, groups: [ send_activation_email ] } 
    - Email: { groups: [ send_activation_email ] } 

chcę zatrzymać sprawdzanie po pierwszym błędzie. Jak mogę to osiągnąć? Czytałem podobne pytania:

Symfony2 : Validation Halt on First Error

How to stop validation on constraint failure in Symfony2

Symfony-2 gives more than one validation error message

ostatni jest dość dobra, ale czy jest jakiś sposób, aby to zrobić bez użycia grupy sprawdzania poprawności za każdym razem, gdy istnieje więcej niż jeden weryfikator? Czytałem gdzieś, że w Symfony 2.2 będzie flaga lub opcja do tego, ale mam wersję 2.2.1 i nie mogę znaleźć takiej opcji.

Odpowiedz

1

Od Symfony 2.3 można to zrobić, używając Group Sequences (chociaż obsługa formularzy dla sekwencji grup może być nieregularna).

+1

Więc jeśli chcę zatrzymać walidację po każdym błędzie, powinienem utworzyć tyle sekwencji grupowych, ile jest maksymalnej liczby walidatorów na jednym polu formularza? Na przykład mam dwa pola, najpierw z 2 walidatorami i drugie z pięcioma. Aby zatrzymać się przy każdym błędzie, muszę utworzyć pięć sekwencji grupowych? – piotrekkr

+0

Jak rozumiem, tak. Chociaż gdybym był tobą, sprawdziłbym obsługę sprawdzania poprawności sekwencji grupowych za pomocą formularzy. Jestem pewien, że wersja 2.2.1 ich nie obsługuje. –

3

Można użyć Chain walidator do tego celu: https://gist.github.com/rybakit/4705749

Oto przykład w prostym PHP:

<?php 

use Symfony\Component\Validator\Constraints\Date; 
use Symfony\Component\Validator\Constraints\Type; 
use Acme\Validator\Constraints\Chain; 

$constraint = new Chain([new Type('string'), new Date()]); 

W XML:

<!-- src/Acme/DemoBundle/Resources/config/validation.xml --> 

<class name="Acme\DemoBundle\Entity\AcmeEntity"> 
    <property name="date"> 
     <constraint name="Acme\Validator\Constraints\Chain"> 
      <option name="constraints"> 
       <constraint name="Type"> 
        <option name="type">string</option> 
       </constraint> 
       <constraint name="Date" /> 
      </option> 
     </constraint> 
    </property> 
</class> 

Ale należy pamiętać, że jeśli chcesz mieć zagnieżdżone ograniczenia Chain, takie jak:

<?php 

$constraint = new Chain([ 
    new Callback(...), 
    new Chain([new Type('string'), new Date()]), 
]); 

musisz zastąpić usługę symfony validator.validator_factory, aby naprawić problem z obsługą zagnieżdżonych wiązań w bieżącej implementacji: https://github.com/symfony/Validator/blob/fc0650c1825c842f9dcc4819a2eaff9922a07e7c/ConstraintValidatorFactory.php#L48.

Zapoznaj się z plikiem NoCacheConstraintValidatorFactory.php, aby dowiedzieć się, jak można go rozwiązać.