2013-05-03 15 views
5

Sto cercando informazioni se c'è qualche tipo di flag/opzione che forza la validazione di symfony2 al primo errore nella catena di validazione. Per esempio io ho tre validatori sul mio email campo:Arresta la convalida sul primo flag di errore in Symfony2?

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

Voglio smettere di convalida dopo il primo errore. Come posso ottenerlo? Leggo domande simili:

Symfony2 : Validation Halt on First Error

How to stop validation on constraint failure in Symfony2

Symfony-2 gives more than one validation error message

L'ultimo che è abbastanza buona, ma c'è un modo per farlo senza l'utilizzo di gruppi di validazione ogni volta, quando ci sono più di uno validatore? Ho letto da qualche parte che in Symfony 2.2 ci sarà una bandiera o un'opzione per questo, ma ho la versione 2.2.1 e non riesco a trovare questa opzione.

risposta

1

A partire da Symfony 2.3 è possibile farlo utilizzando Group Sequences (sebbene il supporto del modulo per le sequenze di gruppo potrebbe essere imprevedibile).

+1

Quindi, se voglio interrompere la convalida dopo ogni errore, dovrei creare tante sequenze di gruppo quante sono il numero massimo di validatori su un singolo campo modulo? Ad esempio, ho due campi, prima con 2 validatori e il secondo con cinque. Quindi per fermarmi su ogni errore devo creare cinque sequenze di gruppo? – piotrekkr

+0

A quanto ho capito, si. Anche se fossi in te controllerei il supporto della validazione della sequenza di gruppo con i moduli. Sono sicuro che la versione 2.2.1 non li supporta. –

3

è possibile utilizzare il Chain validatore per questo scopo: https://gist.github.com/rybakit/4705749

Ecco un esempio in PHP pianura:

<?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()]); 

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

ma essere consapevoli che se si vuole avere nidificati vincoli Chain, ad esempio:

<?php 

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

è necessario sovrascrivere il servizio symfony validator.validator_factory per risolvere il problema con la gestione dei vincoli nidificati nell'attuale implementazione: https://github.com/symfony/Validator/blob/fc0650c1825c842f9dcc4819a2eaff9922a07e7c/ConstraintValidatorFactory.php#L48.

Vedere il file NoCacheConstraintValidatorFactory.php dall'elenco per avere un'idea di come potrebbe essere risolto.

Problemi correlati