Etiquetas de inyección de dependencias

Las etiquetas para la inyección de dependencia son pequeñas cadenas que se pueden aplicar a la «bandera» de un servicio para poder usarla de alguna manera especial. Por ejemplo, si tienes un servicio que quieres registrar como escucha de uno de los principales eventos de Symfony, lo puedes marcar con la etiqueta kernel.event_listener.

Puedes aprender un poco más sobre las «etiquetas» leyendo la sección «Etiquetas» del capítulo Contenedor de Servicio.

A continuación mostramos información sobre todas las etiquetas disponibles en Symfony2. También puede haber etiquetas usadas en otros paquetes que no aparecen aquí. Por ejemplo, AsseticBundle tiene muchas etiquetas no mencionadas aquí.

Tag Name Usage
data_collector Create a class that collects custom data for the profiler
form.type Create a custom form field type
form.type_extension Create a custom “form extension”
form.type_guesser Add your own logic for “form type guessing”
kernel.cache_warmer Register your service to be called during the cache warming process
kernel.event_listener Listen to different events/hooks in Symfony
kernel.event_subscriber To subscribe to a set of different events/hooks in Symfony
kernel.fragment_renderer Add new HTTP content rendering strategies
monolog.logger Logging with a custom logging channel
monolog.processor Add a custom processor for logging
routing.loader Register a custom service that loads routes
security.voter Add a custom voter to Symfony’s authorization logic
security.remember_me_aware To allow remember me authentication
security.listener.factory Necessary when creating a custom authentication system
serializer.encoder Register a new encoder in the serializer service
serializer.normalizer Register a new normalizer in the serializer service
swiftmailer.plugin Register a custom SwiftMailer Plugin
templating.helper Make your service available in PHP templates
translation.loader Register a custom service that loads translations
twig.extension Register a custom Twig Extension
twig.loader Register a custom service that loads Twig templates
validator.constraint_validator Create your own custom validation constraint
validator.initializer Register a service that initializes objects before validation

data_collector

Propósito: Crear una clase que recopile datos personalizados para el generador de perfiles

Para información detallada sobre cómo crear tu propio recolector de datos personalizado, lee el artículo en el recetario: Cómo crear un colector de datos personalizado.

form.type

Propósito: Crear un tipo de campo de formulario personalizado

Para obtener más información sobre cómo crear tu propio tipo de formulario personalizado, lee el artículo en el recetario: Cómo crear un tipo de campo personalizado para formulario.

form.type_extension

Propósito: Crear una «extensión personalizada de Form»

Las extensiones de tipo Form son una manera para «enganchar» la creación de cualquier campo en tu formulario. Por ejemplo, la adición del fragmento CSRF se hace a través de una extensión del tipo Form (la clase Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension).

Una extensión del tipo Form puede modificar cualquier parte de cualquier campo en tu formulario. Para crear una extensión del tipo Form, primero debes crear una clase que implemente la interfaz Symfony\Component\Form\FormTypeExtensionInterface. Por simplicidad, a menudo extenderás una clase Symfony\Component\Form\AbstractTypeExtension en lugar de la interfaz directamente:

// src/Acme/MainBundle/Form/Type/MyFormTypeExtension.php
namespace Acme\MainBundle\Form\Type;

use Symfony\Component\Form\AbstractTypeExtension;

class MyFormTypeExtension extends AbstractTypeExtension
{
    // ... rellena cualquier método que quieras redefinir
    // como buildForm(), buildView(), finishView(), setDefaultOptions()
}

Para dar a conocer tu extensión del tipo Form a Symfony y usarla, ponle la etiqueta form.type_extension:

  • YAML
    services:
        main.form.type.my_form_type_extension:
            class: Acme\MainBundle\Form\Type\MyFormTypeExtension
            tags:
                    - { name: form.type_extension, alias: field }
    
  • XML
    <service id="main.form.type.my_form_type_extension" class="Acme\MainBundle\Form\Type\MyFormTypeExtension">
        <tag name="form.type_extension" alias="field" />
    </service>
    
  • PHP
    $container
        ->register('main.form.type.my_form_type_extension', 'Acme\MainBundle\Form\Type\MyFormTypeExtension')
        ->addTag('form.type_extension', array('alias' => 'field'))
    ;
    

La clave alias de la etiqueta es el tipo de campo al que esta extensión se debe aplicar. Por ejemplo, para aplicar la extensión a cualquier «campo», utiliza el valor 'field'.

form.type_guesser

Propósito: Añade tu propia lógica para «deducir el tipo del formulario»

Esta etiqueta te permite agregar tu propia lógica al proceso de Deducción del tipo del formulario. De manera predeterminada, la deducción del tipo del formulario se hace por medio de «inferencias» basadas en los metadatos de validación y de Doctrine (si estás usando Doctrine).

Para añadir tu propio adivino del tipo de formulario, crea una clase que implemente la interfaz Symfony\Component\Form\FormTypeGuesserInterface. A continuación, marca la definición de este servicio con form.type_guesser (esta no tiene opciones).

Para ver un ejemplo de cómo podría ser esta clase, consulta la clase ValidatorTypeGuesser en el componente Form.

kernel.cache_warmer

Propósito: Registra tu servicio para que sea llamado durante el proceso de precalentamiento para el almacenamiento en caché.

El precalentamiento de la caché se produce cuando ejecutas la tarea cache:warmup o cache:clear (a menos que pases -no-warmp a cache:clear). El propósito es iniciar cualquier caché que necesitará la aplicación y evitar que el primer usuario de algún «uso de caché» importante genera dinámicamente la memoria caché.

Para registrar tu propio precalentamiento de caché, en primer lugar crea un servicio que implemente la interfaz Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface:

// src/Acme/MainBundle/Cache/MyCustomWarmer.php
namespace Acme\MainBundle\Cache;

use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;

class MyCustomWarmer implements CacheWarmerInterface
{
    public function warmUp($cacheDir)
    {
        // hacer algún tipo de operaciones para "calentar" tu memoria caché
    }

    public function isOptional()
    {
            return true;
    }
}

El método isOptional debe devolver true si es posible utilizar la aplicación sin necesidad de llamar al precalentamiento de caché. En Symfony 2.0, los precalentadores opcionales de cualquier modo siempre se ejecutan, por lo tanto esta función no tiene ningún efecto real.

Para registrar tu precalentador en Symfony, ponle la etiqueta kernel.cache_warmer:

  • YAML
    services:
        main.warmer.my_custom_warmer:
            class: Acme\MainBundle\Cache\MyCustomWarmer
            tags:
                    - { name: kernel.cache_warmer, priority: 0 }
    
  • XML
    <service id="main.warmer.my_custom_warmer" class="Acme\MainBundle\Cache\MyCustomWarmer">
        <tag name="kernel.cache_warmer" priority="0" />
    </service>
    
  • PHP
    $container
        ->register('main.warmer.my_custom_warmer', 'Acme\MainBundle\Cache\MyCustomWarmer')
        ->addTag('kernel.cache_warmer', array('priority' => 0))
    ;
    

El valor priority es opcional y por omisión es 0. Este valor puede estar en el rango de -255 a 255, y los precalentadores se ejecutan en ese orden de prioridad.

kernel.event_listener

Propósito: Para escuchar los diferentes eventos o ganchos en Symfony

Esta etiqueta te permite conectar tus propias clases en diferentes puntos del proceso de Symfony.

Para ver un ejemplo completo de este escucha, ve el artículo Cómo crear un escucha de evento del recetario.

Para otro ejemplo práctico de un escucha del núcleo consulta en el recetario el artículo: Cómo registrar un nuevo formato de petición y tipo MIME.

Referencia de escuchas de eventos del núcleo

Al agregar tus propios escuchas, puede ser útil saber sobre los otros escuchas del núcleo de Symfony y sus prioridades.

Nota

Todos los escuchas enumerados aquí posiblemente no figuren dependiendo de tu entorno, configuración y paquetes. Además, los paquetes de terceros traerán escucha adicionales que no figuran en esta lista.

kernel.request

Nombre de la clase escucha Prioridad
Symfony\Component\HttpKernel\EventListener\ProfilerListener 1024
Symfony\Bundle\FrameworkBundle\EventListener\TestSessionListener 192
Symfony\Bundle\FrameworkBundle\EventListener\SessionListener 128
Symfony\Component\HttpKernel\EventListener\RouterListener 32
Symfony\Component\HttpKernel\EventListener\LocaleListener 16
Symfony\Component\Security\Http\Firewall 8

kernel.controller

Nombre de la clase escucha Prioridad
Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector 0

kernel.response

Nombre de la clase escucha Prioridad
Symfony\Component\HttpKernel\EventListener\EsiListener 0
Symfony\Component\HttpKernel\EventListener\ResponseListener 0
Symfony\Bundle\SecurityBundle\EventListener\ResponseListener 0
Symfony\Component\HttpKernel\EventListener\ProfilerListener -100
Symfony\Bundle\FrameworkBundle\EventListener\TestSessionListener -128
Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener -128
Symfony\Component\HttpKernel\EventListener\StreamedResponseListener -1024

kernel.exception

Nombre de la clase escucha Prioridad
Symfony\Component\HttpKernel\EventListener\ProfilerListener 0
Symfony\Component\HttpKernel\EventListener\ExceptionListener -128

kernel.terminate

Nombre de la clase escucha Prioridad
Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener 0

kernel.event_subscriber

Propósito: Para suscribirse a un conjunto de diferentes eventos o ganchos en Symfony.

Nuevo en la versión 2.1: La habilidad para añadir suscriptores a eventos del núcleo se agregó en la versión 2.1.

Para habilitar un suscriptor personalizado, agrégalo como un servicio regular en una de tus configuraciones, y etiquétalo con kernel.event_subscriber:

  • YAML
    services:
        kernel.subscriber.your_subscriber_name:
            class: Nombre\De\Clase\Del\Suscriptor\Completamente\Cualificado
            tags:
                    - { name: kernel.event_subscriber }
    
  • XML
    <service id="kernel.subscriber.your_subscriber_name" class="Nombre\De\Clase\Del\Suscriptor\Completamente\Cualificado">
        <tag name="kernel.event_subscriber" />
    </service>
    
  • PHP
    $container
        ->register('kernel.subscriber.your_subscriber_name', 'Nombre\De\Clase\Del\Suscriptor\Completamente\Cualificado')
        ->addTag('kernel.event_subscriber')
    ;
    

Nota

Tu servicio debe implementar la SymfonyComponentEventDispatcherEventSubscriberInterface.

Nota

Si tu servicio es creado por una factoría, DEBES establecer correctamente el parámetro class para que esta etiqueta trabaje correctamente.

kernel.fragment_renderer

Propósito: Add a new HTTP content rendering strategy.

To add a new rendering strategy - in addition to the core strategies like EsiFragmentRenderer - create a class that implements Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface, register it as a service, then tag it with kernel.fragment_renderer.

monolog.logger

Propósito: Para utilizar un canal personalizado para el registro cronológico de eventos con Monolog.

Monolog te permite compartir sus controladores entre varios canales del registro cronológico de eventos. El servicio de registro cronológico utiliza el canal app pero puedes cambiar el canal cuando inyectes el registro cronológico en un servicio.

  • YAML
    services:
        my_service:
            class: Nombre\De\Clase\Del\Cargador\Completamente\Cualificado
            arguments: ["@logger"]
            tags:
                    - { name: monolog.logger, channel: acme }
    
  • XML
    <service id="my_service" class="Nombre\De\Clase\Del\Cargador\Completamente\Cualificado">
        <argument type="service" id="logger" />
        <tag name="monolog.logger" channel="acme" />
    </service>
    
  • PHP
    $definition = new Definition('Nombre\De\Clase\Del\Cargador\Completamente\Cualificado', array(new Reference('logger'));
    $definition->addTag('monolog.logger', array('channel' => 'acme'));
    $container->register('my_service', $definition);
    

Nota

Esto sólo funciona cuando el servicio del registro cronológico es un argumento del constructor, no cuando se inyecta a través de un definidor.

monolog.processor

Propósito: Añadir un procesador personalizado al registro cronológico.

Monolog te permite agregar procesadores al registro cronológico o a los controladores para añadir datos adicionales en los registros. Un procesador recibe el registro como argumento y lo tiene que devolver después de añadir alguna información adicional en el atributo extra del registro.

Vamos a ver cómo puedes utilizar el IntrospectionProcessor integrado para agregar el archivo, la línea, la clase y el método en que se activó el registro cronológico.

Puedes agregar un procesador globalmente:

  • 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);
    

Truco

Si el servicio no es ejecutable (con __invoke) puedes agregar el atributo method en la etiqueta para utilizar un método específico.

También puedes agregar un procesador para un controlador específico utilizando el atributo handler:

  • 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);
    

También puedes agregar un procesador para un canal del registro cronológico específico usando el atributo channel. Esto registrará el procesador únicamente para el canal de registro cronológico de security utilizado en el componente de seguridad:

  • 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);
    

Nota

No puedes utilizar ambos atributos handler y channel para la misma etiqueta debido a que los controladores se comparten entre todos los canales.

routing.loader

Propósito: Registrar un servicio personalizado que carga rutas.

Para habilitar un cargador de enrutado personalizado, añádelo como un servicio regular en tu configuración, y etiquétalo con routing.loader:

  • YAML
    services:
        routing.loader.your_loader_name:
            class: Nombre\De\Clase\Completamente\Cualificado
            tags:
                    - { name: routing.loader }
    
  • XML
    <service id="routing.loader.your_loader_name" class="Nombre\De\Clase\Completamente\Cualificado">
        <tag name="routing.loader" />
    </service>
    
  • PHP
    $container
        ->register('routing.loader.your_loader_name', 'Nombre\De\Clase\Del\Cargador\Completamente\Cualificado')
        ->addTag('routing.loader')
    ;
    

For more information, see How to create a custom Route Loader.

security.listener.factory

Propósito: Necesaria cuando creas un sistema de autenticación personalizado.

Esta etiqueta se utiliza al crear tu propio sistema de autenticación personalizado. Para más información, consulta Cómo crear un proveedor de autenticación personalizado.

security.remember_me_aware

Propósito: Para permitir la autenticación «recuérdame».

Esta etiqueta se utiliza internamente para permitir que trabaje la autenticación por recordatorio. Si tienes un método de autenticación personalizado en que el usuario se pueda autenticar por medio de recordatorio, entonces posiblemente tengas que utilizar esta etiqueta.

Si tu factoría de autenticación personalizada extiende la clase Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory y tu escucha de autenticación personalizado extiende la clase Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener, entonces el escucha de autenticación personalizado ya está etiquetado y funcionará automáticamente.

security.voter

Propósito: Agregar un votante personalizado a la lógica de autorización de Symfony.

Cuando llamas a isGranted en el contexto de seguridad de Symfony, detrás del escenario se usa un sistema de «votantes» para determinar si el usuario debe tener acceso. La etiqueta security.voter te permite agregar tu propio votante personalizado al sistema.

Para obtener más información, lee el artículo del recetario: Cómo implementar tu propio votante para agregar direcciones IP a la lista negra.

serializer.encoder

Propósito: Register a new encoder in the serializer service

The class that’s tagged should implement the Symfony\Component\Serializer\Encoder\EncoderInterface and Symfony\Component\Serializer\Encoder\DecoderInterface.

For more details, see How to use the Serializer.

serializer.normalizer

Propósito: Register a new normalizer in the Serializer service

The class that’s tagged should implement the Symfony\Component\Serializer\Normalizer\NormalizerInterface and Symfony\Component\Serializer\Normalizer\DenormalizerInterface.

For more details, see How to use the Serializer.

swiftmailer.plugin

Propósito: Registrar un complemento personalizado a SwiftMailer.

Si estás usando un complemento personalizado para SwiftMailer (o deseas crear uno), lo puedes registrar en SwiftMailer creando un servicio para tu complemento y etiquétalo como swiftmailer.plugin (que no tiene opciones).

Un complemento de SwiftMailer debe implementar la interfaz Swift_Events_EventListener. Para más información sobre los complementos, consulta la sección Complemento para SwiftMailer de su documentación.

Varios complementos de SwiftMailer son fundamentales para Symfony y los puedes activar a través de diversa configuración. Para obtener más información, consulta Configurando el SwiftmailerBundle (“swiftmailer”).

templating.helper

Propósito: Poner tu servicio a disposición de las plantillas PHP

Para habilitar un ayudante de plantilla personalizado, añádelo como un servicio regular en tu configuración, etiquétalo con templating.helper y define un atributo alias (el ayudante será accesible a través de este alias en las plantillas):

  • YAML
    services:
        templating.helper.your_helper_name:
            class: Nombre\De\Clase\Ayudante\Completamente\Cualificado
            tags:
                    - { name: templating.helper, alias: alias_name }
    
  • XML
    <service id="templating.helper.your_helper_name" class="Nombre\De\Clase\Ayudante\Completamente\Cualificado">
        <tag name="templating.helper" alias="alias_name" />
    </service>
    
  • PHP
    $container
        ->register('templating.helper.your_helper_name', 'Nombre\De\Clase\Ayudante\Completamente\Cualificado')
        ->addTag('templating.helper', array('alias' => 'alias_name'))
    ;
    

translation.loader

Propósito: Registrar un servicio personalizado que carga traducciones.

De forma predeterminada, las traducciones se cargan desde el sistema de archivos en una variedad de diferentes formatos (YAML, XLIFF, PHP, etc.). Si necesitas cargar traducciones de alguna otra fuente, en primer lugar crea una clase que implemente la interfaz Symfony\Component\Translation\Loader\LoaderInterface:

// src/Acme/MainBundle/Translation/MyCustomLoader.php
namespace Acme\MainBundle\Translation;

use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;

class MyCustomLoader implements LoaderInterface
{
    public function load($resource, $locale, $domain = 'messages')
    {
        $catalogue = new MessageCatalogue($locale);

        // de alguna forma carga algunas traducciones desde el
        // directorio "resource" y luego las coloca en el catálogo
        $catalogue->set('hello.world', 'Hello World!', $domain);

        return $catalogue;
    }
}

El método load de tu cargador personalizado es responsable de devolver una clase Symfony\Component\Translation\MessageCatalogue.

Ahora, registra tu cargador como un servicio y etiquétalo como translation.loader:

  • YAML
    services:
        main.translation.my_custom_loader:
            class: Acme\MainBundle\Translation\MyCustomLoader
            tags:
                    - { name: translation.loader, alias: bin }
    
  • XML
    <service id="main.translation.my_custom_loader" class="Acme\MainBundle\Translation\MyCustomLoader">
        <tag name="translation.loader" alias="bin" />
    </service>
    
  • PHP
    $container
        ->register('main.translation.my_custom_loader', 'Acme\MainBundle\Translation\MyCustomLoader')
        ->addTag('translation.loader', array('alias' => 'bin'))
    ;
    

La opción alias es necesaria y muy importante: Esta define la «extensión» del archivo que se utilizará para los archivos de recursos que usa este cargador. Por ejemplo, supongamos que tienes un formato bin personalizado que necesitas cargar. Si tienes un archivo bin que contiene traducciones al Francés del dominio menssages, entonces podrías tener un archivo app/Resources/translations/messages.fr.bin.

Cuando Symfony intenta cargar el archivo bin, pasa la ruta de acceso a tu cargador personalizado como el argumento $resource a cargar. Entonces, puedes llevar a cabo cualquier lógica que necesites en ese archivo para cargar tus traducciones.

Si vas a cargar las traducciones desde una base de datos, todavía necesitas un archivo de recursos, pero bien podría estar en blanco o contener un poco de información sobre la carga de los recursos desde la base de datos. El archivo es la clave para activar el método load en tu cargador personalizado.

twig.extension

Propósito: Registrar una extensión de Twig personalizada.

Para habilitar una extensión Twig, añádela como un servicio regular en tu configuración, y etiquétala con twig.extension:

  • YAML
    services:
        twig.extension.your_extension_name:
            class: Nombre\De\Clase\De\La\Extensión\Completamente\Cualificado
            tags:
                    - { name: twig.extension }
    
  • XML
    <service id="twig.extension.your_extension_name" class="Nombre\De\Clase\De\La\Extensión\Completamente\Cualificado">
        <tag name="twig.extension" />
    </service>
    
  • PHP
    $container
        ->register('twig.extension.your_extension_name', 'Nombre\De\Clase\De\La\Extensión\Completamente\Cualificado')
        ->addTag('twig.extension')
    ;
    

Para más información sobre cómo crear la clase real para la extensión de Twig, consulta el tema en la documentación de extensiones o lee el artículo del recetario: Cómo escribir una extensión Twig personalizada

Antes de escribir tus propias extensiones, echa un vistazo al Repositorio oficial de extensiones Twig el cual ya cuenta con varias útiles extensiones. Por ejemplo Intl y su filtro localizeddate que formatea una fecha según la configuración regional del usuario. Estas extensiones oficiales de Twig también se tienen que añadir como servicios normales:

  • 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')
    ;
    

twig.loader

Propósito: Registrar un servicio personalizado que cargue plantillas Twig

De manera predeterminada, Symfony sólo utiliza un Cargador TwigSymfony\Bundle\TwigBundle\Loader\FilesystemLoader. Si necesitas cargar plantillas Twig desde otro recurso, puedes crear un servicio para el nuevo cargador y etiquetarlo con twig.loader:

  • YAML
    services:
        acme.demo_bundle.loader.some_twig_loader:
            class: Acme\DemoBundle\Loader\SomeTwigLoader
            tags:
                    - { name: twig.loader }
    
  • XML
    <service id="acme.demo_bundle.loader.some_twig_loader" class="Acme\DemoBundle\Loader\SomeTwigLoader">
        <tag name="twig.loader" />
    </service>
    
  • PHP
    $container
        ->register('acme.demo_bundle.loader.some_twig_loader', 'Acme\DemoBundle\Loader\SomeTwigLoader')
        ->addTag('twig.loader')
    ;
    

validator.constraint_validator

Propósito: Crear tu propia restricción de validación personalizada.

Esta etiqueta te permite crear y registrar tu propia restricción de validación personalizada. Para obtener más información, lee el artículo del recetario: Cómo crear una restricción de validación personalizada.

validator.initializer

Propósito: Registrar un servicio que inicia los objetos antes de validarlos.

Esta etiqueta proporciona una pieza de funcionalidad muy poco común que te permite realizar algún tipo de acción sobre un objeto justo antes de validarlo. Por ejemplo, Doctrine lo utiliza para consultar todos los datos cargados de manera diferida en un objeto antes de validarlos. Sin esto, algunos datos sobre una entidad de Doctrine parecería que hubieran «desaparecido» cuando se validan, a pesar de que este no sea realmente el caso.

Si necesitas usar esta etiqueta, solo crea una nueva clase que implemente la interfaz Symfony\Component\Validator\ObjectInitializerInterface. Luego, etiquétala como validator.initializer (que no tiene opciones).

Para un ejemplo, consulta la clase EntityInitializer en el puente de Doctrine.

Bifúrcame en GitHub