Usándola

Clases no controladoras

Las clases no controladoras están configuradas, y gestionadas por Symfony DIC justo como cualquier otro servicio que configuras utilizando YAML, XML o PHP. La única diferencia es que lo puedes hacer a través de anotaciones, lo cual es mucho más conveniente.

Puedes utilizar estas anotaciones en servicios (para ejemplos, ve más adelante): @Service, @Inject, @InjectParams, @Observe, @Tag

Ten en cuenta que no puedes usar la anotación @Inject en propiedades privadas o protegidas. Del mismo modo, la anotación @InjectParams no funciona en métodos protegidos o privados.

Controladores

Los controladores son un tipo de clase especial que también son tratadas especialmente por este paquete. La diferencia más notable es que no es necesario definir estas clases como servicios. Sí, no hay servicios, pero no te preocupes que todavía puedes utilizar todas las características de la DIC, e incluso algunas más.

Inyectando en el constructor/definidor

<?php

use JMS\DiExtraBundle\Annotation as DI;

class Controller
{
    private $em;
    private $session;

    /**
     * @DI\InjectParams({
     *     "em" = @DI\Inject("doctrine.orm.entity_manager"),
     *     "session" = @DI\Inject("session")
     * })
     */
    public function __construct($em, $session)
    {
        $this->em = $em;
        $this->session = $session;
    }
    // ... algunas acciones
}

Nota

La inyección en el constructor no es posible cuándo una definición del padre también define un constructor qué está configurado para inyección.

Inyectando propiedades

<?php

use JMS\DiExtraBundle\Annotation as DI;

class Controller
{
    /** @DI\Inject("doctrine.orm.entity_manager") */
    private $em;

    /** @DI\Inject("session") */
    private $session;
}

Nota

Inyectar propiedades privadas o protegidas sólo es compatible en controladores.

Inyectando en método/captador

<?php

use JMS\DiExtraBundle\Annotation as DI;

class Controller
{
    public function myAction()
    {
        // ...
        if ($condition) {
            $mailer = $this->getMailer();
        }
    }

    /** @DI\LookupMethod("mailer") */
    protected function getMailer() { /* aquí el cuerpo está vacío */ }
}

Puedes utilizar este tipo de inyección si tienes una dependencia que no siempre se necesita en el controlador, y que es costoso iniciarla, como el mailer en el ejemplo anterior.

Bifúrcame en GitHub