Anotaciones

@Inject

Esta marca una propiedad o parámetro para inyección:

<?php

use JMS\DiExtraBundle\Annotation\Inject;

class Controller
{
    /**
     * @Inject("security.context", required = false)
     */
    private $securityContext;

    /**
     * @Inject("request", strict = false)
     */
    private $request;

    /**
     * @Inject("%kernel.cache_dir%")
     */
    private $cacheDir;

    /**
     * @Inject
     */
    private $session;
}

Truco

Si no especificas el servicio explícitamente, intentaremos deducirlo basándonos en el nombre de la propiedad o parámetro.

La opción «strict» se puede pasar a false para evitar excepciones de tipo Symfony\Component\DependencyInjection\Exception\ScopeCrossingInjectionException, si el aámbito del servicio inyectado es diferente del actual (por ejemplo, request o prototype).

@InjectParams

Esta marca los parámetros de un método para inyección:

<?php

use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service
 */
class Listener
{
    /**
     * @InjectParams({
     *     "em" = @Inject("doctrine.entity_manager")
     * })
     */
    public function __construct(EntityManager $em, Session $session)
    {
        // ...
    }
}

Si no defines todos los parámetros en la asignación de parámetros, trataremos de adivinar cuáles servicios se deben inyectar basándonos en el nombre de los demás parámetros.

@Service

Marca una clase como un servicio:

<?php

use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service("some.service.id", parent="another.service.id", public=false)
 */
class Listener
{
}

Si no defines explícitamente un identificador del servicio, entonces se generará uno predeterminado basado en el nombre completamente cualificado de la clase.

@Tag

Añade una etiqueta al servicio:

<?php

use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;

/**
 * @Service
 * @Tag("doctrine.event_listener", attributes = {"event" = "postGenerateSchema", lazy=true})
 */
class Listener
{
    // ...
}

@Observe

Automáticamente registra un método como escucha de un determinado evento:

<?php

use JMS\DiExtraBundle\Annotation\Observe;
use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service
 */
class RequestListener
{
    /**
     * @Observe("kernel.request", priority = 255)
     */
    public function onKernelRequest()
    {
        // ...
    }
}

@Validator

Automáticamente registra la clase como restricción de validación para el componente Validador:

<?php

use JMS\DiExtraBundle\Annotation\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @Validator("my_alias")
 */
class MyValidator extends ConstraintValidator
{
    // ...
}

class MyConstraint extends Constraint
{
    // ...
    public function validatedBy()
    {
        return 'my_alias';
    }
}

La anotación @Validator además implica la anotación @Service, si no la especificas explícitamente. Los alias que se pasan a la anotación @Validator deben coincidir con la cadena devuelta desde el método validatedBy de tu restricción.

@FormType

Automáticamente registra la clase suministrada como un tipo form en el componente Form de Symfony2.

<?php

use JMS\DiExtraBundle\Annotation\FormType;
use Symfony\Component\Form\AbstractType;

/**
 * @FormType
 */
class MyFormType extends AbstractType
{
    // ...

    public function getName()
    {
        return 'my_form';
    }
}

// Controller.php
$form = $this->formFactory->create('my_form');

Nota

@FormType implica @Service si no se definió explícitamente.

@DoctrineListener o @DoctrineMongoDBListener

Automáticamente, registra la clase dada como un escucha para el ORM de Doctrine o el ODM del MongoDB de Doctrine:

<?php

use JMS\DiExtraBundle\Annotation\DoctrineListener;

/**
 * @DoctrineListener(
 *     events = {"prePersist", "preUpdate"},
 *     connection = "default",
 *     lazy = true,
 *     priority = 0,
 * )
class MyListener
{
    // ...
}

Nota

@DoctrineListener implica @Service si no se definió explícitamente.

Bifúrcame en GitHub