Как добавить валидаторы на лету в Symfony2? - PullRequest
6 голосов
/ 23 марта 2012

У меня есть поле формы password (, а не , сопоставленное с User паролем) для использования в форме смены пароля, а также два других (сопоставленных) поля, first и last.

Я должен добавить валидаторы на лету: если значение для пароль пустое, то проверка не должна выполняться.В противном случае следует добавить новые валидаторы MinLength и MaxLength .

Вот что я сделал до сих пор: создайте повторяющееся поле password, добавьте CallbackValidatorи return если $form->getData() равно null.

Тогда, как я могу добавить валидаторы для минимальной и максимальной длины в поле $?

    $builder = $this->createFormBuilder($user);

    $field = $builder->create('new_password', 'repeated',  array(
            'type'          => 'password',
            'first_name'    => 'Password',
            'second_name'   => 'Confirm password',
            'required'      => false,
            'property_path' => false // Not mapped to the entity password
        ));

    // Add a callback validator the the password field
    $field->addValidator(new Form\CallbackValidator(function($form) {
        $data = $form->getData();

        if(is_null($data)) return; // Field is blank

        // Here password is provided and match confirm, check min = 3 max = 10

    }));

    // Add fields to the form
    $form = $builder
        ->add('first', 'text', array('required' => false)) // Mapped
        ->add('last',  'text', array('required' => false)) // Mapped
        ->add($field)                                      // Not mapped
        ->getForm();

Ответы [ 2 ]

9 голосов
/ 23 марта 2012

Ну что ж, сам нашел решение после нескольких экспериментов.

Я оставлю этот вопрос без ответа на пару дней, так как можно выложить лучшее решение , чтобыло бы очень кстати:)

В частности, я нашел избыточную сумму new FormError, не знаю, есть ли лучший способ добавить ошибку в форму.И, честно говоря, не знаю, почему new Form\CallbackValidator работает, а new CallbackValidator - нет.

Итак, не забудьте добавить use операторы, подобные этим:

use Symfony\Component\Form as Form, // Mendatory
    Symfony\Component\Form\FormInterface,
    Symfony\Component\Validator\Constraints\MinLength,
    Symfony\Component\Validator\Constraints\MinLengthValidator;

И обратный вызов:

$validation = function(FormInterface $form) {

     // If $data is null then the field was blank, do nothing more
    if(is_null($data = $form->getData())) return;

    // Create a new MinLengthValidator
    $validator = new MinLengthValidator();

    // If $data is invalid against the MinLength constraint add the error
    if(!$validator->isValid($data, new MinLength(array('limit' => 3)))) :

        $template   = $validator->getMessageTemplate();    // Default error msg
        $parameters = $validator->getMessageParameters();  // Default parameters

         // Add the error to the form (to the field "password")
        $form->addError(new Form\FormError($template, $parameters));

    endif;

};

Ну, и это та часть, которую я не могу понять (почему я вынужден использовать префикс Form), но это нормально:

$builder->get('password')->addValidator(new Form\CallbackValidator($validation));
5 голосов
/ 17 августа 2014

addValidator устарела и полностью удалена с момента выпуска Symfony 2.3.

Вы можете сделать это, прослушав событие POST_SUBMIT

$builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
    $data = $event->getData();
    $form = $event->getForm();

    if (null === $data) {
        return;
    }
    if ("Your logic here") {
        $form->get('new_password')->addError(new FormError());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...