我正在尝试将自定义事件订阅者与我的应用程序的所有形式相关联。
我首先创建了Event Subscriber类
getAndIncrement()
我知道我可以将它与 <?php
namespace AppBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
/**
* Custom form listener.
*/
class FormListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SUBMIT => 'onPreSubmit',
FormEvents::SUBMIT => 'onSubmit',
FormEvents::POST_SUBMIT => 'onPostSubmit',
FormEvents::PRE_SET_DATA => 'onPreSetData',
FormEvents::POST_SET_DATA => 'onPostSetData',
);
}
public function onPreSubmit(FormEvent $event)
{
// code here
}
public function onSubmit(FormEvent $event)
{
// code here
}
public function onPostSubmit(FormEvent $event)
{
// code here
}
public function onPreSetData(FormEvent $event)
{
// code here
}
public function onPostSetData(FormEvent $event)
{
// code here
}
}
函数
buildForm
到目前为止一切正常。
现在的问题是:因为我想将这个事件子分发器添加到我的应用程序的所有形式(执行一些常见的检查并为表单操作提供钩子)我想不要在每个表单中实例化我的事件订阅者,但是在服务容器内(在services.yml中),如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// code here
->addEventSubscriber(new \AppBundle\EventListener\FormListener());
}
毋庸置疑,第二种方法不起作用。所以我的问题是:我做错了吗?是否可以在表单中收听表单事件 ?我的做法有问题吗?
答案 0 :(得分:2)
您可以为FormType创建表单扩展名,这是所有其他名称的基本类型。
表单扩展名应如下所示:
namespace AppBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormBuilderInterface;
class FormTypeExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->addEventSubscriber(new \AppBundle\EventListener\FormListener());
}
public function getExtendedType()
{
return FormType::class;
}
}
然后在服务容器中注册此扩展名,如下所示:
services:
app.form_type_extension:
class: AppBundle\Form\Extension\FormTypeExtension
tags:
- { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FromType }
中的进一步参考