The Dependency Injection Tags

Tags:

  • data_collector
  • form.type
  • form.type_extension
  • form.type_guesser
  • kernel.cache_warmer
  • kernel.event_listener
  • kernel.event_subscriber
  • monolog.logger
  • monolog.processor
  • templating.helper
  • routing.loader
  • translation.loader
  • twig.extension
  • validator.initializer

Enabling Custom PHP Template Helpers

To enable a custom template helper, add it as a regular service in one of your configuration, tag it with templating.helper and define an alias attribute (the helper will be accessible via this alias in the templates):

  • YAML
    services:
        templating.helper.your_helper_name:
            class: Fully\Qualified\Helper\Class\Name
            tags:
                - { name: templating.helper, alias: alias_name }
    
  • XML
    <service id="templating.helper.your_helper_name" class="Fully\Qualified\Helper\Class\Name">
        <tag name="templating.helper" alias="alias_name" />
    </service>
    
  • PHP
    $container
        ->register('templating.helper.your_helper_name', 'Fully\Qualified\Helper\Class\Name')
        ->addTag('templating.helper', array('alias' => 'alias_name'))
    ;
    

Enabling Custom Twig Extensions

To enable a Twig extension, add it as a regular service in one of your configuration, and tag it with twig.extension:

  • YAML
    services:
        twig.extension.your_extension_name:
            class: Fully\Qualified\Extension\Class\Name
            tags:
                - { name: twig.extension }
    
  • XML
    <service id="twig.extension.your_extension_name" class="Fully\Qualified\Extension\Class\Name">
        <tag name="twig.extension" />
    </service>
    
  • PHP
    $container
        ->register('twig.extension.your_extension_name', 'Fully\Qualified\Extension\Class\Name')
        ->addTag('twig.extension')
    ;
    

For information on how to create the actual Twig Extension class, see Twig’s documentation on the topic.

Before writing your own extensions, have a look at the Twig official extension repository which already includes several useful extensions. For example Intl and its localizeddate filter that formats a date according to user’s locale. These official Twig extensions also have to be added as regular services:

  • YAML
    services:
        twig.extension.intl:
            class: Twig_Extensions_Extension_Intl
            tags:
                - { name: twig.extension }
    
  • XML
    <service id="twig.extension.intl" class="Twig_Extensions_Extension_Intl">
        <tag name="twig.extension" />
    </service>
    
  • PHP
    $container
        ->register('twig.extension.intl', 'Twig_Extensions_Extension_Intl')
        ->addTag('twig.extension')
    ;
    

Enabling Custom Listeners

To enable a custom listener, add it as a regular service in one of your configuration, and tag it with kernel.event_listener. You must provide the name of the event your service listens to, as well as the method that will be called:

  • YAML
    services:
        kernel.listener.your_listener_name:
            class: Fully\Qualified\Listener\Class\Name
            tags:
                - { name: kernel.event_listener, event: xxx, method: onXxx }
    
  • XML
    <service id="kernel.listener.your_listener_name" class="Fully\Qualified\Listener\Class\Name">
        <tag name="kernel.event_listener" event="xxx" method="onXxx" />
    </service>
    
  • PHP
    $container
        ->register('kernel.listener.your_listener_name', 'Fully\Qualified\Listener\Class\Name')
        ->addTag('kernel.event_listener', array('event' => 'xxx', 'method' => 'onXxx'))
    ;
    

Note

You can also specify priority as an attribute of the kernel.event_listener tag (much like the method or event attributes), with either a positive or negative integer. This allows you to make sure your listener will always be called before or after another listener listening for the same event.

Enabling Custom Subscribers

New in version 2.1: The ability to add kernel event subscribers is new to 2.1.

To enable a custom subscriber, add it as a regular service in one of your configuration, and tag it with kernel.event_subscriber:

  • YAML
    services:
        kernel.subscriber.your_subscriber_name:
            class: Fully\Qualified\Subscriber\Class\Name
            tags:
                - { name: kernel.event_subscriber }
    
  • XML
    <service id="kernel.subscriber.your_subscriber_name" class="Fully\Qualified\Subscriber\Class\Name">
        <tag name="kernel.event_subscriber" />
    </service>
    
  • PHP
    $container
        ->register('kernel.subscriber.your_subscriber_name', 'Fully\Qualified\Subscriber\Class\Name')
        ->addTag('kernel.event_subscriber')
    ;
    

Note

Your service must implement the SymfonyComponentEventDispatcherEventSubscriberInterface interface.

Note

If your service is created by a factory, you MUST correctly set the class parameter for this tag to work correctly.

Enabling Custom Template Engines

To enable a custom template engine, add it as a regular service in one of your configuration, tag it with templating.engine:

  • YAML
    services:
        templating.engine.your_engine_name:
            class: Fully\Qualified\Engine\Class\Name
            tags:
                - { name: templating.engine }
    
  • XML
    <service id="templating.engine.your_engine_name" class="Fully\Qualified\Engine\Class\Name">
        <tag name="templating.engine" />
    </service>
    
  • PHP
    $container
        ->register('templating.engine.your_engine_name', 'Fully\Qualified\Engine\Class\Name')
        ->addTag('templating.engine')
    ;
    

Enabling Custom Routing Loaders

To enable a custom routing loader, add it as a regular service in one of your configuration, and tag it with routing.loader:

  • YAML
    services:
        routing.loader.your_loader_name:
            class: Fully\Qualified\Loader\Class\Name
            tags:
                - { name: routing.loader }
    
  • XML
    <service id="routing.loader.your_loader_name" class="Fully\Qualified\Loader\Class\Name">
        <tag name="routing.loader" />
    </service>
    
  • PHP
    $container
        ->register('routing.loader.your_loader_name', 'Fully\Qualified\Loader\Class\Name')
        ->addTag('routing.loader')
    ;
    

Using a custom logging channel with Monolog

Monolog allows you to share its handlers between several logging channels. The logger service uses the channel app but you can change the channel when injecting the logger in a service.

  • YAML
    services:
        my_service:
            class: Fully\Qualified\Loader\Class\Name
            arguments: [@logger]
            tags:
                - { name: monolog.logger, channel: acme }
    
  • XML
    <service id="my_service" class="Fully\Qualified\Loader\Class\Name">
        <argument type="service" id="logger" />
        <tag name="monolog.logger" channel="acme" />
    </service>
    
  • PHP
    $definition = new Definition('Fully\Qualified\Loader\Class\Name', array(new Reference('logger'));
    $definition->addTag('monolog.logger', array('channel' => 'acme'));
    $container->register('my_service', $definition);;
    

Note

This works only when the logger service is a constructor argument, not when it is injected through a setter.

Adding a processor for Monolog

Monolog allows you to add processors in the logger or in the handlers to add extra data in the records. A processor receives the record as an argument and must return it after adding some extra data in the extra attribute of the record.

Let’s see how you can use the built-in IntrospectionProcessor to add the file, the line, the class and the method where the logger was triggered.

You can add a processor globally:

  • YAML
    services:
        my_service:
            class: Monolog\Processor\IntrospectionProcessor
            tags:
                - { name: monolog.processor }
    
  • XML
    <service id="my_service" class="Monolog\Processor\IntrospectionProcessor">
        <tag name="monolog.processor" />
    </service>
    
  • PHP
    $definition = new Definition('Monolog\Processor\IntrospectionProcessor');
    $definition->addTag('monolog.processor');
    $container->register('my_service', $definition);
    

Tip

If your service is not a callable (using __invoke) you can add the method attribute in the tag to use a specific method.

You can add also a processor for a specific handler by using the handler attribute:

  • YAML
    services:
        my_service:
            class: Monolog\Processor\IntrospectionProcessor
            tags:
                - { name: monolog.processor, handler: firephp }
    
  • XML
    <service id="my_service" class="Monolog\Processor\IntrospectionProcessor">
        <tag name="monolog.processor" handler="firephp" />
    </service>
    
  • PHP
    $definition = new Definition('Monolog\Processor\IntrospectionProcessor');
    $definition->addTag('monolog.processor', array('handler' => 'firephp');
    $container->register('my_service', $definition);
    

You can also add a processor for a specific logging channel by using the channel attribute. This will register the processor only for the security logging channel used in the Security component:

  • YAML
    services:
        my_service:
            class: Monolog\Processor\IntrospectionProcessor
            tags:
                - { name: monolog.processor, channel: security }
    
  • XML
    <service id="my_service" class="Monolog\Processor\IntrospectionProcessor">
        <tag name="monolog.processor" channel="security" />
    </service>
    
  • PHP
    $definition = new Definition('Monolog\Processor\IntrospectionProcessor');
    $definition->addTag('monolog.processor', array('channel' => 'security');
    $container->register('my_service', $definition);
    

Note

You cannot use both the handler and channel attributes for the same tag as handlers are shared between all channels.