Laravel y Base de Datos

Entorno de trabajo y repaso de Laravel

1

Qué aprenderás sobre Laravel Avanzado

2

Repaso de Laravel y requisitos del curso

3

Configuración de la base de datos-SQLite en Laravel

4

Instalación, configuración y uso de Homestead

5

Instalar Laravel Sanctum

6

API de autenticación: laravel UI y laravel sanctum

Manejo de tu base de datos con Laravel

7

Capa de transformación con API Resources

8

Manejo de relaciones en bases de datos con Laravel

9

Relaciones Polimórficas en Eloquent

La terminal de Laravel

10

Cómo crear comandos para la terminal de Laravel

11

Ejecutando comandos desde la API

12

Programación de tareas

Eventos y tareas de Laravel

13

Eventos y Listeners en Laravel

14

Eventos de Eloquent

15

Introducción al uso de Queues y Jobs

16

Cómo disparar eventos en Queues

17

Laravel Horizon

Manejo de errores

18

Cómo capturar y leer errores con la clase Handler

19

Excepciones personalizadas

20

Excepciones HTTP personalizadas y debugging con Laravel Telescope

21

Configuración de logs y channels en Laravel

El corazón de Laravel

22

Ciclo de vida de una aplicación en Laravel

23

¿Qué son los service containers?

24

¿Cómo funciona un service container?

25

Registro y carga de clases con service providers

Creación de paquetes

26

¿Cómo crear mis propios paquetes de Laravel?

27

Propiedades para manejo de dependencias

28

Comprende el archivo composer.json

29

Extendiendo composer.json, autocarga de clases y PSR-4

30

Crear mis propios Services Providers

31

Publicación de archivos

32

Uso de repositorios locales

33

Publicación de paquetes en packagist

¿Cómo funciona un service container?

24/33

Lectura

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();

Cómo funcionan los Service Containers

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.

Cómo usamos los servicios dentro del container de una aplicación

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

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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.