【问题标题】:How to add global event listener in symfony forms如何在 symfony 表单中添加全局事件监听器
【发布时间】:2018-02-14 08:35:34
【问题描述】:

我想为 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 symfony symfony-forms symfony-2.7


    【解决方案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 }
    

    【讨论】:

    • 这是可行的,但该示例适用于 symfony 2.8 对于 2.7,标签为 { name: form.type_extension, alias: form},getExtendedType 返回值为 form
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多