Search code examples
phpsymfonysymfony-formssymfony-2.7

How to add global event listener in symfony forms


I want to add event listener to all symfony forms on pre_set_data.

I have service and tag for this { name: kernel.event_listener, event: form.pre_set_data, method: onSetData}

The event listener is registered and I can see it with php app/console debug:event-dispatcher but is is never called.

When I add the event directly to the form using ->addEventListener(FormEvents::PRE_SET_DATA, function(){ ... }) it is working.

How I can add this event listener globally ? to all forms?


Solution

  • A simple way would be to create a form extension that extends the base form type, and register your event listener there:

    <?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;
        }
    }
    

    with:

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