如何在Symfony2中动态添加验证器?

gre*_*emo 6 forms validation symfony-forms symfony

我有一个password表单字段(映射到User密码)用于更改密码表单,以及另外两个(映射)字段,firstlast.

我要动态添加验证器:如果密码值为空,则不应进行验证.否则,新的MinLengthMaxLength验证应增加.

这里是我到目前为止已经完成:创建重复password字段,添加CallbackValidatorreturn如果$form->getData()null.

那么,如何在$ field中添加最小和最大长度的验证器?

    $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();
Run Code Online (Sandbox Code Playgroud)

gre*_*emo 9

哦,经过几次实验后,我自己找到了一个解决方案.

我要留下这个问题几天没问题,因为人们可以发布更好的解决方案,这真的非常受欢迎:)

特别是,我发现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;
Run Code Online (Sandbox Code Playgroud)

回调是:

$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;

};
Run Code Online (Sandbox Code Playgroud)

好吧,这是我无法理解的部分(为什么我被迫加上前缀Form),但它没关系:

$builder->get('password')->addValidator(new Form\CallbackValidator($validation));
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,我收到:`当我调用`$ builder-> get('password') - > addValidator(...)时,调用未定义的方法Symfony\Component\Form\FormBuilder :: addValidator` (3认同)

gha*_*ano 5

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());
    }
});
Run Code Online (Sandbox Code Playgroud)