バリデーターをイベントサブスクライバーに変更するためのヘルプを探している他の人は(通常のサブスクライバーとは少し異なるため)、次のようにします。
ステップ1
変化する:
$builder->addValidator(new AddNameFieldValidator());
に
$builder->addEventSubscriber(new 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またはその他)に登録する必要はありません
参照:
http ://symfony.com/doc/2.2/cookbook/form/dynamic_form_modification.html#adding-an-event-subscriber-to-a-form-class