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.
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.
<?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.
<?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.
<?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.