2013-05-03 4 views
5

Я ищу информацию, если есть какой-то флаг/параметр, который принудительно завершает проверку symfony2 при первой ошибке в цепочке валидации. Например, у меня есть три валидаторов на моем email поля:Остановить проверку флажка первой ошибки в Symfony2?

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

Я хочу, чтобы остановить проверку после первой ошибки. Как я могу это достичь? Я читаю подобные вопросы:

Symfony2 : Validation Halt on First Error

How to stop validation on constraint failure in Symfony2

Symfony-2 gives more than one validation error message

Последний один довольно хорошо, но есть ли способ сделать это без использования групп проверки каждый раз, когда есть больше чем один валидатор? Я где-то читал, что в Symfony 2.2 для этого будет флаг или опция, но я имею версию 2.2.1 и не могу найти такой вариант.

ответ

1

С Symfony 2.3 вы можете сделать это с помощью Group Sequences (хотя поддержка форм для групповых последовательностей может быть пятнистой).

+1

Итак, если я хочу прекратить проверку после каждой ошибки, я должен создать столько групповых последовательностей, сколько есть максимальное число валидаторов в одном поле формы? Например, у меня есть две записи, сначала с двумя валидаторами, а вторая с пятью. Итак, чтобы остановиться на каждой ошибке, я должен создать пять групповых последовательностей? – piotrekkr

+0

Как я понимаю, да. Хотя, если бы я был вами, я бы проверял поддержку валидации групповой последовательности формами. Я уверен, что версия 2.2.1 не поддерживает их. –

3

Вы можете использовать Chain валидатор для этой цели: https://gist.github.com/rybakit/4705749

Вот пример простой 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()]); 

В 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> 

Но следует помнить, что если вы хотите иметь вложенные ограничения Chain, например:

<?php 

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

Вы должны переопределить службу symfony validator.validator_factory, чтобы устранить проблему с обработкой вложенных ограничений в текущей реализации: https://github.com/symfony/Validator/blob/fc0650c1825c842f9dcc4819a2eaff9922a07e7c/ConstraintValidatorFactory.php#L48.

Просмотрите файл NoCacheConstraintValidatorFactory.php, чтобы узнать, как его решить.

Смежные вопросы