如何以符号形式添加全球事件听众



我想将事件侦听器添加到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(){ ... })直接将事件添加到表单时,它正在工作。

如何在全球添加此事件侦听器?到所有形式?

一种简单的方法是创建一个扩展基本表单类型的表单扩展名,并在此处注册事件侦听器:

<?php
namespace AppBundleFormExtension;
use SymfonyComponentFormAbstractTypeExtension;
use SymfonyComponentFormExtensionCoreTypeFormType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentFormFormEvents;
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;
    }
}

with:

# config/services.yaml
services:
    # ...
    AppBundleFormExtensionFormTypeExtension:
        tags:
            - { name: form.type_extension, extended_type: SymfonyComponentFormExtensionCoreTypeFormType }

最新更新