我有一个使用'property_path' => false 添加的额外未绑定字段的表单。
我想在这个领域做一个简单的验证,我发现很多答案建议使用类似的东西
$builder->addValidator(...);
但我已经看到在 symfony 2.1 中 $builder->addValidator 已被弃用。有谁知道在 Symfony 2.1 中对未绑定字段进行验证的正确方法是什么?
我有一个使用'property_path' => false 添加的额外未绑定字段的表单。
我想在这个领域做一个简单的验证,我发现很多答案建议使用类似的东西
$builder->addValidator(...);
但我已经看到在 symfony 2.1 中 $builder->addValidator 已被弃用。有谁知道在 Symfony 2.1 中对未绑定字段进行验证的正确方法是什么?
我刚刚对主题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
}
}
这就是我验证我的非映射字段的方式,直到我发现如何使用验证器执行此操作。
我从我们得到的文档中遇到了同样的问题:
接口 FormValidatorInterface 已被弃用,将在 Symfony 2.3 中删除。如果您使用此接口实现了自定义验证器,则可以用侦听 FormEvents::POST_BIND(或任何其他 *BIND 事件)的事件侦听器替换它们。如果您使用了 CallbackValidator 类,您现在应该将回调直接传递给 addEventListener。
这建议使用事件侦听器,但我还没有找到示例。
https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md