Ver índice de contenidos del libro

16.8. Servicios internos de Symfony y servicios de bundles de terceros

Como Symfony2 y todos los bundles desarrollados por terceros configuran y obtienen sus servicios a través del contenedor, puedes acceder fácilmente a ellos e incluso utilizarlos en tus propios servicios. Para facilitar las cosas, Symfony2 no obliga por defecto a que los controladores se definan como servicios. De hecho, Symfony2 inyecta el contenedor de servicios completo en cada controlador. Así, para gestionar por ejemplo el almacenamiento de información en la sesión del usuario, Symfony2 proporciona un servicio llamado session, que se puede acceder dentro de un controlador estándar de la siguiente manera:

public function indexAction($bar)
{
    $session = $this->get('session');
    $session->set('foo', $bar);
 
    // ...
}

Resulta muy común utilizar los servicios internos de Symfony2 o los de los bundles de terceros para realizar tareas como el procesado de plantillas (templating), el envío de mensajes de correo electrónico (mailer), o para acceder a información sobre la petición.

Puedes dar un paso más allá usando estos servicios dentro de los servicios que has creado para tu aplicación. Empieza modificando el NewsletterManager para usar el gestor de correo propio de Symfony2, que es el servicio mailer (en vez del anterior servicio my_mailer propio). También vamos a pasar el servicio del motor de plantillas al NewsletterManager para que puedas generar el contenido del correo electrónico a través de una plantilla:

namespace Acme\HelloBundle\Newsletter;
 
use Symfony\Component\Templating\EngineInterface;
 
class NewsletterManager
{
    protected $mailer;
 
    protected $templating;
 
    public function __construct(\Swift_Mailer $mailer, EngineInterface $templating)
    {
        $this->mailer = $mailer;
        $this->templating = $templating;
    }
 
    // ...
}

Configurar el contenedor de servicios resulta bastante sencillo:

services:
    newsletter_manager:
        class:     %newsletter_manager.class%
        arguments: ["@mailer", "@templating"]
<service id="newsletter_manager" class="%newsletter_manager.class%">
    <argument type="service" id="mailer"/>
    <argument type="service" id="templating"/>
</service>
$container->setDefinition('newsletter_manager', new Definition(
    '%newsletter_manager.class%',
    array(
        new Reference('mailer'),
        new Reference('templating'),
    )
));

El servicio newsletter_manager ahora tiene acceso a los servicios internos mailer y templating. El ejemplo anterior es una forma común de crear servicios propios de tu aplicación que aprovechan el poder de los distintos servicios internos de Symfony.

Truco Asegúrate de que la clave swiftmailer aparece en la configuración de tu aplicación. Como se mencionó anteriormente, la presencia de la clave swiftmailer es la que hace que se cargue la extensión de servicio desde el bundle SwiftmailerBundle, que a su vez, registra el servicio mailer.