如何在symfony表单中添加全局事件侦听器

时间:2018-02-14 08:35:34

标签: php symfony symfony-forms symfony-2.7

我想在pre_set_data上为所有symfony表单添加事件监听器。

我有{ name: kernel.event_listener, event: form.pre_set_data, method: onSetData}

的服务和标记

事件监听器已注册,我可以使用php app/console debug:event-dispatcher查看它,但永远不会被调用。

当我使用->addEventListener(FormEvents::PRE_SET_DATA, function(){ ... })将事件直接添加到表单时,它正在运行。

如何全局添加此事件侦听器?各种形式?

1 个答案:

答案 0 :(得分:1)

一种简单的方法是创建一个扩展基本表单类型的form extension,并在那里注册您的事件监听器:

<?php

namespace AppBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;

class FormTypeExtension extends AbstractTypeExtension
{
    /**
     * @inheritdoc
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function () {
            // skip...
        });
    }

    /**
     * @inheritdoc
     */
    public function getExtendedType()
    {
        return FormType::class;
    }
}

使用:

# config/services.yaml
services:
    # ...

    AppBundle\Form\Extension\FormTypeExtension:
        tags:
            - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }