Php Symfony2中已弃用的方法addValidation和类CallbackValidator

Php Symfony2中已弃用的方法addValidation和类CallbackValidator,php,symfony-2.1,Php,Symfony 2.1,我有个问题。我需要验证表单类型类中实体中不存在的字段。我以前使用过以下代码: $builder->addValidator(new CallbackValidator(function(FormInterface $form){ if (!$form['t_and_c']->getData()) { $form->addError(new FormError('Please accept the terms and conditions in order

我有个问题。我需要验证表单类型类中实体中不存在的字段。我以前使用过以下代码:

$builder->addValidator(new CallbackValidator(function(FormInterface $form){
    if (!$form['t_and_c']->getData()) {
        $form->addError(new FormError('Please accept the terms and conditions in order to registe'));
    }
}))

但是由于symfony2.1方法
addValidator
和类
CallbackValidator
被弃用。有人知道我应该使用什么吗?

该接口
FormValidatorInterface
已被弃用,将在Symfony 2.3中删除

如果使用此接口实现了自定义验证器,则可以 用事件侦听器代替它们,以侦听
FormEvents::POST_BIND
(或任何其他
*BIND
事件)。万一 您使用了CallbackValidator类,现在应该传递回调 直接发送到
addEventListener


通过

我是这样做的:

add('t_and_c', 'checkbox', array(
            'property_path' => false,
            'constraints' => new True(array('message' => 'Please accept the terms and conditions in order to register')),
            'label' => 'I agree'))

对于希望获得帮助将其验证器更改为事件订阅者的任何其他人(因为它与普通订阅者略有不同),请执行以下操作:

第一步 更改:

$builder->addValidator(新的AddNameFieldValidator())

$builder->addEventSubscriber(新的AddNameFieldSubscriber())

步骤2 将验证器类(以及所有名称空间)替换为订阅者类。 您的订阅服务器类应如下所示:

// src/Acme/DemoBundle/Form/EventListener/AddNameFieldSubscriber.php
namespace Acme\DemoBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormError;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AddNameFieldSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(FormEvents::POST_BIND => 'postBind');
    }

    public function postBind(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        $form->addError(new FormError('oh poop'))
    }
}
您不需要在服务文件(yml或其他)中注册订户。


参考:
CallbackValidator
并没有被弃用,事实上,它是。太棒了!谢谢你发布这个!使用Symfony\Component\Validator\Constraints\True;谢谢你的回复!请注意,您应该将答案的重要部分发布在此网站上,否则您的帖子可能会被删除。如果您愿意,您可以继续添加该链接,但仅作为“参考”。答案应独立,无需链接。答案已修改。