Los servicios estándar de Symfony2

Posted by victor on January 27th, 2013
symfony2-logoEl Service Containercontenedor de servicios es una pieza muy importante de Symfony2 que permite instanciar y organizar algunos objetos de nuestra aplicación en un lugar centralizado. Gracias al Inyector de dependencias es capaz de construir los objetos entregándoles, en el momento de la construcción, las clases de las que depende. Como resultado obtenemos una mayor reutilización de nuestro código y un mayor nivel de desacoplamiento entre nuestras clases.

¿Qué es un servicio?

Un servicio en Symfony2 no es más que una instancia de una clase, accesible de forma global, que se encarga de realizar una tarea determinada. Cuando en algún controlador de nuestra aplicación necesitamos enviar un correo, obtenemos el servicio mailer que provee todo lo necesario para administrar el envío de emails:
class ControladorDeTuAplicacion extends Controller {
   public function holaAction() {
      $this->get('mailer'); // Obtiene el servicio de envío de email
   }
}
Nuestra aplicación puede extender el Service Container con servicios propios. La forma más sencilla, si usas el formato YML, es crear una clase, que contendrá la lógica de nuestro servicio, y editar el fichero services.yml dentro de /Resources/config de nuestro bundle para darle un nombre al servicio e indicar las dependencias que presenta:
namespace AcmeBundle\MiGestorDeCorreo;

//
// Gestor de envío de correos de mi proyecto
//
class MiGestorDeCorreo
{
    private $mailer;

    public function __construct($mailer)
    {
        $this->mailer = $mailer; // Gestor de correo de Symfony2
    }

    public function eviarCorreoDeBienvenida()
    {
        // ...
    }
}
Ahora solo queda registrar la clase en el fichero services.yml de alguno de nuestros bundles, normalmente, en aquel con el que presenta más afinidad:
services:
    acme.gestorCorreo:
        class: AcmeBundle\MiGestorDeCorreo # Namespace completo a nuestra clase
        arguments: [@mailer] # dependencia1, dependencia2,... dependenciaN
Como argumentos puedes pasar otros servicios (se emplea la '@'), constantes, y variables declaradas en el services.yml. Ahora, gracias al nombre que hemos dado al servicio podemos obtener una instancia de nuestro gestor de correo desde cualquier controlador de forma sencilla: $this->get('acme.gestorCorreo')

Lista de servicios estándar

Existe una extensa lista de servicios que forma parte Symfony2  y que se pueden obtener mediante la consola de Symfony: $ php app/console container:debug De ellos, los más usados suelen ser los siguientes:
  • request: Representa la petición en curso.
  • mailer: Utilidades relacionadas con el envío de correos. Es un wrapper del componente Swift Mailer.
  • doctrine: Doctrine es el ORM por defecto de Symfony2 y se encarga de la persistencia de datos. Mediante este servicio se puede obtener en Entity Manager.
  • twig: Motor de plantillas
  • security.context: Información de la sesión de usuario: token, roles, autenticación...

Comments

comments powered by Disqus