Haré todo lo posible para explicar los servicios, pero el Symfony2 docs hará un mejor trabajo del que yo podré.
En esencia, un servicio es simplemente una clase. Una clase se convierte en un servicio cuando se registra con Symfony2 Dependency Injection Container
(o simplemente Container
). En este punto, la clase es parte de la capa de servicio de una aplicación.
Un servicio puede tener dependencias (y muchas veces lo hace), pero no es obligatorio. Un servicio se usa a menudo como una dependencia para otros servicios. Déjeme darle un ejemplo:
- tiene una clase utilizada para enviar correo electrónico, llamadas
EmailSender
- tiene una clase que contiene las instrucciones sobre cómo enviar correo electrónico a través de SMTP, denominada
SmtpTransport
EmailSender
tiene una dependencia en la forma de SmtpTransport
. En otras palabras, para que EmailSender
pueda hacer su trabajo, necesita una instancia de SmtpTransport
para ser inyectado en él. (Tenga en cuenta que aunque EmailSender
tiene una dependencia, SmtpTransport
no lo hace.)
que usted necesita para usar EmailSender
en cinco lugares diferentes en su aplicación. En cada punto, es posible que tenga un código como éste:
$emailSender = new EmailSender(new SmtpTransport());
$emailSender->send($email)
eso no es una gran cantidad de código (ya EmailSender
sólo tiene una dependencia), pero lo que sucede cuando se decide que en vez de usar SMTP, EmailSender
debe utilizar un transporte clase para sendmail
? Tendría que editar cada bloque de código para actualizarlo.
La alternativa es registrar EmailSender
y sus dependencias como servicios.
registro es el siguiente:
// YourApp/YourBundle/Resources/config/services.yml
services:
smtp_transport:
class: YourApp\YourBundle\Email\SmtpTransport
email_sender:
class: YourApp\YourBundle\Email\EmailSender
arguments:
- @smtp_transport
Ahora, para usarlo (de un contexto conscientes container
):
$container->get('email_sender')->send($email);
cuenta de lo mucho más simple y más limpio que es utilizar realmente la clase para enviar mensajes de correo electrónico ? Claro, primero tienes que hacer el trabajo para registrar el servicio, pero eso es trivial y solo se debe hacer una vez.
Imagine que EmailSender
tiene tres dependencias, en lugar de una. Al usar servicios, solo necesita modificar el registro del servicio sin tener que cambiar su código de implementación (el código utilizado para enviar el correo electrónico).
En resumen, la capa de servicio actúa como un repositorio central para las clases que a) tienen una o más dependencias b) deben utilizarse en un ámbito 'global'.Al obtener estas clases de servicio del Dependency Injection Container
, termina con menos código redundante y una forma más fácil de realizar cambios de gran alcance.
Puedo estar equivocado, pero creo que Symfony2 es el primer framework PHP en implementar un contenedor de inyección de dependencia. Como tal, muchos desarrolladores de PHP pueden no estar familiarizados con el concepto de servicios. Definitivamente le sugiero que se asegure de comprenderlo completamente, ya que verá que es una herramienta muy poderosa. Además, el concepto de servicios no está limitado de ninguna manera a Symfony2 o incluso a PHP: podrá aprovechar este concepto en una amplia variedad de marcos e idiomas.
Entendí DI pero no pude entender lo del servicio – user825904
es lo mismo. un servicio es solo una clase que se ha especificado en el DIC – MDrollette
He estado aprendiendo Symfony2 desde este enlace http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html, ¿Alguien puede decirme qué es la capa de servicio en este o cómo este tutorial usa la capa de servicio – user825904