【问题标题】:validation on unbound form field对未绑定的表单字段进行验证
【发布时间】:2012-07-08 23:28:22
【问题描述】:

我有一个表单,其中使用 'property_path' => false 添加了一个额外的未绑定字段。

我想对此字段进行简单验证,并且我发现许多答案建议使用类似

$builder->addValidator(...);

但我已经看到在 symfony 2.1 中 $builder->addValidator 已被弃用。有谁知道在 Symfony 2.1 中对未绑定字段进行验证的正确方法是什么?

【问题讨论】:

  • 嗨,你有没有找到办法做到这一点?我正在尝试对未绑定字段的 LengthValidator 执行相同的操作,但似乎找不到正确的方法。

标签: symfony-2.1


【解决方案1】:

我从我们得到的文档中遇到了同样的问题:

接口 FormValidatorInterface 已被弃用,将被 在 Symfony 2.3 中删除。如果您使用实现自定义验证器 这个接口,你可以用事件监听器替换它们 到 FormEvents::POST_BIND (或任何其他 *BIND 事件)。在 如果您使用了 CallbackValidator 类,您现在应该通过 直接回调到 addEventListener。

这建议使用事件侦听器,但我没有找到示例。

https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md

【讨论】:

    【解决方案2】:

    编辑:

    我刚刚对主题Symfony validate form with mapped false form fields做了一个更完整的回答

    原答案

    验证表单中的未绑定(非映射)字段没有很好的文档记录,快速发展的表单和验证器组件使少数示例已过时(对于 Symfony 2.1.2)。

    现在,我通过事件侦听器成功验证了非映射字段。 这是我的简化代码:

    namespace Dj\TestBundle\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    
    use Symfony\Component\Form\FormEvents;
    use Dj\TestBundle\Form\EventListener\NewPostListener;
    
    class PostType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('lineNumber', 'choice', array(
                            'label' => 'How many lines :',
                            'choices' => array(
                                3 => '3 lines',
                                6 => '6 lines'
                            ),
                            // 'data' => 3, // default value
                            'expanded' => true,
                            'mapped' => false
                        ))
                    ->add('body', 'textarea', array(
                            'label' => 'Your text',
                            'max_length' => 120));
    
            // this listener will validate form datas
            $listener = new NewPostListener;
            $builder->addEventListener(FormEvents::POST_BIND, array($listener, 'postBind'));
        }
    
        // ... other methods
    }
    

    还有事件监听器:

    namespace Dj\TestBundle\Form\EventListener;
    
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormError;
    
    /**
     * listener used at Post creation time to validate non mapped fields
     */
    class NewPostListener
    {
    
        /**
         * Validates lineNumber and body length
         * @param \Symfony\Component\Form\FormEvent $event
         */
        public function postBind(FormEvent $event)
        {
            $form = $event->getForm();
            $data = $event->getData();
    
            if (!isset($data->lineNumber)) {
                $msg = 'Please give a correct line number';
                $form->get('lineNumber')->addError(new FormError($msg));
            }
            
            // ... other validations
    
        }
    }
    

    这就是我验证非映射字段的方式,直到我发现如何使用验证器来执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2016-07-16
      • 1970-01-01
      • 2023-03-24
      • 2012-08-13
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多