2013-05-03 35 views
5

Tôi đang tìm kiếm thông tin nếu có một số loại cờ/tùy chọn buộc bắt buộc xác thực symfony2 dừng lại trên lỗi đầu tiên trong chuỗi xác nhận. Ví dụ: tôi có ba trình xác thực trên trường email của mình:Dừng xác thực trên cờ lỗi đầu tiên trong Symfony2?

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

Tôi muốn ngừng xác thực sau lỗi đầu tiên. Làm thế nào tôi có thể đạt được điều đó? Tôi đọc câu hỏi tương tự:

Symfony2 : Validation Halt on First Error

How to stop validation on constraint failure in Symfony2

Symfony-2 gives more than one validation error message

một cuối là khá tốt nhưng có cách nào để làm điều này mà không cần sử dụng các nhóm xác nhận mọi thời gian, khi có nhiều hơn một trình xác thực? Tôi đọc ở đâu đó trong Symfony 2.2 sẽ có một lá cờ hoặc tùy chọn cho điều này, nhưng tôi có phiên bản 2.2.1 và không thể tìm thấy tùy chọn đó.

Trả lời

1

Kể từ Symfony 2.3, bạn có thể thực hiện việc này bằng cách sử dụng Group Sequences (mặc dù hỗ trợ biểu mẫu cho chuỗi nhóm có thể là spotty).

+1

Vì vậy, nếu tôi muốn ngừng xác thực sau mỗi lỗi, tôi nên tạo bao nhiêu chuỗi nhóm vì có số lượng trình xác thực tối đa trên một trường biểu mẫu duy nhất? Ví dụ tôi có hai lần nộp đơn, đầu tiên với 2 người xác nhận hợp lệ và thứ hai với năm người. Vì vậy, để ngăn chặn mọi lỗi, tôi phải tạo ra năm chuỗi nhóm? – piotrekkr

+0

Như tôi đã hiểu, vâng. Mặc dù nếu tôi là bạn tôi sẽ kiểm tra hỗ trợ xác nhận trình tự nhóm với các biểu mẫu. Tôi chắc chắn phiên bản 2.2.1 không hỗ trợ chúng. –

3

Bạn có thể sử dụng Chain validator cho mục đích đó: https://gist.github.com/rybakit/4705749

Dưới đây là một ví dụ trong PHP đơn giản:

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

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

Nhưng hãy lưu ý rằng nếu bạn muốn có giới hạn lồng nhau Chain, như:

<?php 

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

bạn phải ghi đè dịch vụ symfony validator.validator_factory để khắc phục sự cố với xử lý các ràng buộc lồng nhau trong triển khai hiện tại: https://github.com/symfony/Validator/blob/fc0650c1825c842f9dcc4819a2eaff9922a07e7c/ConstraintValidatorFactory.php#L48.

Xem tệp NoCacheConstraintValidatorFactory.php từ ý chính để biết ý tưởng về cách giải quyết.

Các vấn đề liên quan