未绑定表单字段的验证

时间:2012-07-09 14:33:14

标签: symfony-2.1

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

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

的内容
$builder->addValidator(...);

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

2 个答案:

答案 0 :(得分:5)

编辑:

我刚刚就主题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

    }
}

这是我验证非映射字段的方法,直到我找到如何使用验证器执行此操作。

答案 1 :(得分:0)

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

  

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

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

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