Ciclo de vida de la solicitud
Introducción
Cuando usas cualquier herramienta en el «mundo real», te sientes más seguro si entiendes cómo funciona esa herramienta. El desarrollo de aplicaciones no es diferente. Cuando entiendes cómo funcionan tus herramientas de desarrollo, te sientes más cómodo y seguro usándolas.
El objetivo de este documento es darte una buena visión general de alto nivel de cómo funciona el framework Laravel. Al conocer mejor el framework en general, todo se siente menos «mágico» y te sentirás más seguro construyendo tus aplicaciones. Si no entiendes todos los términos de inmediato, ¡no te desanimes! Solo trata de obtener una comprensión básica de lo que está sucediendo, y tu conocimiento crecerá a medida que explores otras secciones de la documentación.
Resumen del Ciclo de Vida
Primeros Pasos
El punto de entrada para todas las solicitudes a una aplicación Laravel es el archivo public/index.php
. Todas las solicitudes son dirigidas a este archivo por la configuración de tu servidor web (Apache / Nginx). El archivo index.php
no contiene mucho código. Más bien, es un punto de partida para cargar el resto del framework.
El archivo index.php
carga la definición del autoloader generada por Composer y luego recupera una instancia de la aplicación Laravel desde bootstrap/app.php
. La primera acción que realiza Laravel es crear una instancia de la aplicación / contenedor de servicios.
Kernels HTTP / Consola
A continuación, la solicitud entrante se envía al kernel HTTP o al kernel de consola, utilizando los métodos handleRequest
o handleCommand
de la instancia de la aplicación, dependiendo del tipo de solicitud que ingrese a la aplicación. Estos dos kernels sirven como la ubicación central a través de la cual fluyen todas las solicitudes. Por ahora, centrémonos en el kernel HTTP, que es una instancia de Illuminate\Foundation\Http\Kernel
.
El kernel HTTP define una matriz de bootstrappers que se ejecutarán antes de que se ejecute la solicitud. Estos bootstrappers configuran el manejo de errores, configuran el registro, detectan el entorno de la aplicación y realizan otras tareas que deben hacerse antes de que la solicitud sea manejada. Típicamente, estas clases manejan la configuración interna de Laravel de la que no necesitas preocuparte.
El kernel HTTP también es responsable de pasar la solicitud a través del stack de middleware de la aplicación. Estos middleware manejan la lectura y escritura de la sesión HTTP, determinan si la aplicación está en modo de mantenimiento, verifican el token CSRF y más. Hablaremos más sobre estos pronto.
La firma del método para el método handle
del kernel HTTP es bastante simple: recibe una Request
y devuelve una Response
. Piensa en el kernel como una gran caja negra que representa toda tu aplicación. Dale solicitudes HTTP y devolverá respuestas HTTP.
Proveedores de Servicios
Una de las acciones de bootstrap más importantes del kernel es cargar los proveedores de servicios para tu aplicación. Los proveedores de servicios son responsables de inicializar todos los diversos componentes del framework, como los componentes de base de datos, colas, validación y enrutamiento.
Laravel iterará a través de esta lista de proveedores e instanciará cada uno de ellos. Después de instanciar los proveedores, se llamará al método register
en todos los proveedores. Luego, una vez que todos los proveedores hayan sido registrados, se llamará al método boot
en cada proveedor. Esto es para que los proveedores de servicios puedan depender de que todos los enlaces del contenedor estén registrados y disponibles para cuando se ejecute su método boot
.
Esencialmente, cada característica importante ofrecida por Laravel es inicializada y configurada por un proveedor de servicios. Dado que inicializan y configuran tantas características ofrecidas por el framework, los proveedores de servicios son el aspecto más importante de todo el proceso de bootstrap de Laravel.
Mientras que el framework internamente usa docenas de proveedores de servicios, también tienes la opción de crear los tuyos propios. Puedes encontrar una lista de los proveedores de servicios definidos por el usuario o de terceros que tu aplicación está usando en el archivo bootstrap/providers.php
.
Enrutamiento
Una vez que la aplicación ha sido inicializada y todos los proveedores de servicios han sido registrados, la Request
se entregará al enrutador para su despacho. El enrutador enviará la solicitud a una ruta o controlador, así como ejecutará cualquier middleware específico de la ruta.
Los middleware proporcionan un mecanismo conveniente para filtrar o examinar las solicitudes HTTP que ingresan a tu aplicación. Por ejemplo, Laravel incluye un middleware que verifica si el usuario de tu aplicación está autenticado. Si el usuario no está autenticado, el middleware redirigirá al usuario a la pantalla de inicio de sesión. Sin embargo, si el usuario está autenticado, el middleware permitirá que la solicitud continúe más adentro de la aplicación. Algunos middleware se asignan a todas las rutas dentro de la aplicación, como PreventRequestsDuringMaintenance
, mientras que algunos solo se asignan a rutas o grupos de rutas específicos. Puedes aprender más sobre los middleware leyendo la documentación completa de middleware.
Si la solicitud pasa a través de todos los middleware asignados a la ruta coincidente, se ejecutará el método de la ruta o del controlador y la respuesta devuelta por el método de la ruta o del controlador se enviará de vuelta a través de la cadena de middleware de la ruta.
Finalizando
Una vez que el método de la ruta o del controlador devuelve una respuesta, la respuesta viajará de regreso a través del middleware de la ruta, dando a la aplicación la oportunidad de modificar o examinar la respuesta saliente.
Finalmente, una vez que la respuesta viaja de regreso a través del middleware, el método handle
del kernel HTTP devuelve el objeto de respuesta al handleRequest
de la instancia de la aplicación, y este método llama al método send
en la respuesta devuelta. El método send
envía el contenido de la respuesta al navegador web del usuario. ¡Ahora hemos completado nuestro viaje a través de todo el ciclo de vida de la solicitud en Laravel!
Enfoque en los Proveedores de Servicios
Los proveedores de servicios son realmente la clave para inicializar una aplicación Laravel. Se crea la instancia de la aplicación, se registran los proveedores de servicios y la solicitud se entrega a la aplicación inicializada. ¡Es realmente así de simple!
Tener una comprensión firme de cómo se construye e inicializa una aplicación Laravel a través de los proveedores de servicios es muy valioso. Los proveedores de servicios definidos por el usuario de tu aplicación se almacenan en el directorio app/Providers
.
Por defecto, el AppServiceProvider
está bastante vacío. Este proveedor es un excelente lugar para agregar la inicialización propia de tu aplicación y los enlaces del contenedor de servicios. Para aplicaciones grandes, es posible que desees crear varios proveedores de servicios, cada uno con una inicialización más granular para servicios específicos utilizados por tu aplicación.