Symfony2:在服务容器中实例化表单事件订阅者

时间:2016-05-11 13:10:58

标签: php forms symfony

我正在尝试将自定义事件订阅者与我的应用程序的所有形式相关联。

我首先创建了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());
    }

毋庸置疑,第二种方法不起作用。所以我的问题是:我做错了吗?是否可以在表单中收听表单事件 ?我的做法有问题吗?

1 个答案:

答案 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 }

the cookbook

中的进一步参考