https://www.youtube.com/watch?v=_z9nzEUgro4
En ese vídeo se explica el concepto de Service Container muy fácilmente. Está en inglés pero es entendible.
Laravel y Base de Datos
Entorno de trabajo y repaso de Laravel
Qué aprenderás sobre Laravel Avanzado
Repaso de Laravel y requisitos del curso
Configuración de la base de datos-SQLite en Laravel
Instalación, configuración y uso de Homestead
Instalar Laravel Sanctum
API de autenticación: laravel UI y laravel sanctum
Manejo de tu base de datos con Laravel
Capa de transformación con API Resources
Manejo de relaciones en bases de datos con Laravel
Relaciones Polimórficas en Eloquent
La terminal de Laravel
Cómo crear comandos para la terminal de Laravel
Ejecutando comandos desde la API
Programación de tareas
Eventos y tareas de Laravel
Eventos y Listeners en Laravel
Eventos de Eloquent
Introducción al uso de Queues y Jobs
Cómo disparar eventos en Queues
Laravel Horizon
Manejo de errores
Cómo capturar y leer errores con la clase Handler
Excepciones personalizadas
Excepciones HTTP personalizadas y debugging con Laravel Telescope
Configuración de logs y channels en Laravel
El corazón de Laravel
Ciclo de vida de una aplicación en Laravel
¿Qué son los service containers?
¿Cómo funciona un service container?
Registro y carga de clases con service providers
Creación de paquetes
¿Cómo crear mis propios paquetes de Laravel?
Propiedades para manejo de dependencias
Comprende el archivo composer.json
Extendiendo composer.json, autocarga de clases y PSR-4
Crear mis propios Services Providers
Publicación de archivos
Uso de repositorios locales
Publicación de paquetes en packagist
En la clase pasada vimos como es el ciclo de vida de una petición, ahora vamos a conocer acerca del Contenedor de Servicios de Laravel o, como se suele llamar, el Service Container.
El Service Container es una herramienta poderosa para administrar las dependencias de clases, nos permite realizar inyección de dependencias. Cuando hablamos de inyección de dependencias significa que las dependencias de clase se “inyectan” en la clase a través del constructor o, en algunos casos, métodos “setter”.
Si quieres saber más en detalle acerca de la inyección de dependencias, podemos leer el artículo del creador del Framework Symfony, Fabien Potencier:v http://fabien.potencier.org/what-is-dependency-injection.html.
Hay muchas maneras de acceder a la instancia del container, en Laravel es tan simple como usar el helper app()
.
$container = app();
Una de sus funciones es poder inyectar una dependencia dentro de una clase por medio del constructor, por ejemplo:
De manera que, en lugar de tener que hacer un new AnotherClass, simplemente lo colocamos como parámetro del constructor. El contenedor va saber cómo instanciar las dependencias de tal manera que, suponiendo que AnotherClass no tiene dependencias propias, sería algo como:
$instance = new MyClass(new AnotherClass());
Si tuviera dependencias propias, el container también la va a resolver de manera recursiva hasta que no haya más.
Una comprensión profunda del Service Container de Laravel es esencial para construir una aplicación potente y grande, así como para contribuir al core de Laravel.
Acá es donde aparece la palabra binding, uno de esos términos que se aplica en muchos lugares, pero que en Laravel nos ayuda a vincular un servicio a la Aplicación. Al hacer esto, podemos vincular implementaciones de nuestras dependencias o servicios y poder acceder a ellas dentro del Container. Casi todos los bindings del contenedor de servicios se registran en los Services Providers.
Y, por otro lado, no es necesario vincular clases en el Container si no dependen de ninguna interfaz, ya que se resuelven mediante reflexión. Pero si necesitamos levantar servicios específicos o que dependen de una interfaz, dentro de la documentación de Laravel vamos a encontrar como hacer los distintos tipos de Bindings: https://laravel.com/docs/7.x/container#binding.
Por ejemplo, dentro de un Service Provider:
$this->app->bind(
'App\Contracts\PaymentGateway',
'App\Services\MercadoPagoGateway'
);
Esta declaración le dice al Container que debe inyectar el MercadoPagoGateway
cuando una clase necesita una implementación de PaymentGateway
. Ahora podemos utilizar en cualquier parte de nuestra aplicación la interfaz PaymentGateway
.
public function __construct(PaymentGateway $payments)
{
$this->payments = $payments;
}
En la siguiente clase hablaremos un poco de los Services Providers. 💪
Aportes 5
Preguntas 0
https://www.youtube.com/watch?v=_z9nzEUgro4
En ese vídeo se explica el concepto de Service Container muy fácilmente. Está en inglés pero es entendible.
Vale, falta una imagen pero por lo que entiendo el container se encarga de resolver todas las dependencias que una clase necesite, aunque no entiendo muy bien cómo funcionaría esto si con binding tenemos que especificar qué dependencia inyectar cuando se requiera tal interfaz (Contract)
Faltaría una explicación más detallada de esto 🤔
En la parte que dice:
Una de sus funciones es poder inyectar una dependencia dentro de una clase por medio del constructor, por ejemplo:
Falta una imagen, que parece que la borraron del contenedor
Excelente en este sentido nos facilita trabajar con clases con constructores muy complejos de alguna manera resulve parte del problema que resuelve el patron factory, con la ventaja de poder acceder a la interfaz en cualquier lugar muy interesante.
Muy buen texto del tema. Gracias.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.