Comprender los conceptos básicos de Laravel Middleware

En este artículo, profundizaremos en el marco de Laravel para comprender el concepto de middleware. La primera mitad del artículo comienza con una introducción al middleware y para qué se utiliza en realidad..

A medida que avancemos, veremos cómo crear middleware personalizado en una aplicación Laravel. Después de crear su middleware personalizado, exploraremos las opciones disponibles para registrarlo con Laravel para que pueda ser invocado durante el flujo de procesamiento de solicitudes..

Espero que te consideres familiarizado con los conceptos básicos de Laravel y la herramienta de línea de comandos Artisan para generar el código del andamio. Por supuesto, una instalación operativa de la última aplicación Laravel le permite ejecutar los ejemplos proporcionados en este artículo de inmediato..

¿Qué es el middleware en Laravel??

Podríamos pensar en el software intermedio como un mecanismo que le permite conectarse al flujo de procesamiento de solicitudes típico de una aplicación Laravel. Un procesamiento de rutas Laravel típico pasa por ciertas etapas del procesamiento de solicitudes, y el middleware es una de esas capas por las que una aplicación debe pasar..

Entonces, ¿cuál es exactamente el punto de conexión en el flujo de procesamiento de solicitudes de Laravel? Piense en algo que requiera una ejecución en las primeras etapas del arranque de una aplicación. Por ejemplo, es necesario autenticar a los usuarios en las primeras etapas para decidir si se les permite acceder a la ruta actual.

Algunas cosas que podría pensar que podría lograr a través del middleware son:

  • registro de solicitudes
  • redirigiendo a los usuarios
  • alterar / desinfectar los parámetros entrantes
  • Manipulando la respuesta generada por la aplicación Laravel.
  • y muchos más

De hecho, la aplicación predeterminada de Laravel ya incluye un par de piezas importantes de middleware. Por ejemplo, hay un software intermedio que comprueba si el sitio está en modo de mantenimiento. Por otro lado, hay middleware para sanear los parámetros de solicitud de entrada. Como mencioné anteriormente, la autenticación del usuario también se logra mediante el propio middleware..

Espero que la explicación hasta el momento le ayude a sentirse más seguro con el término middleware. Si aún estás confundido, no te preocupes, ya que vamos a crear un middleware personalizado a partir de la siguiente sección que debería ayudarte a comprender exactamente cómo se puede usar el middleware en el mundo real..

Cómo crear middleware personalizado

En esta sección, crearemos nuestro middleware personalizado. Pero, ¿qué va a lograr exactamente nuestro middleware personalizado??

Recientemente, encontré un requisito personalizado de mi cliente de que si los usuarios accedían al sitio desde cualquier dispositivo móvil, deberían redirigirse a la URL del subdominio correspondiente con todos los parámetros de la cadena de consulta intactos. Creo que este es el caso de uso perfecto para demostrar cómo se puede usar el middleware Laravel en este escenario particular.

La razón por la que nos gustaría usar middleware en este caso es la necesidad de conectarse al flujo de solicitudes de la aplicación. En nuestro middleware personalizado, inspeccionaremos el agente de usuario y los usuarios serán redirigidos a la URL móvil correspondiente si están usando un dispositivo móvil.

Habiendo discutido toda esa teoría, saltemos al desarrollo real, y esa es la mejor manera de entender un nuevo concepto, ¿no es así??

Como desarrollador de Laravel, es la herramienta Artisan que terminará utilizando la mayor parte del tiempo para crear un código de plantilla básico en caso de que desee crear alguna funcionalidad personalizada. Vamos a usarlo para crear un código de plantilla básico para nuestro middleware personalizado.

Dirígete a la línea de comandos y ve a la raíz del documento de tu proyecto. Ejecute el siguiente comando para crear la plantilla de middleware personalizada MobileRedirect.

php artisan make: middleware MobileRedirect

Y eso debería crear un archivo. app / Http / Middleware / MobileRedirect.php con el siguiente código.

La mayoría de las veces, notará la implementación del encargarse de El método que actúa como la columna vertebral del middleware y la lógica primaria del middleware que está buscando implementar debe ir aquí..

Permítanme aprovechar esta oportunidad para presentar los tipos de middleware con los que viene Laravel. Principalmente, son dos tipos: antes de middleware y después de middleware.

Como sugiere su nombre, el middleware anterior es algo que se ejecuta antes de que la solicitud se maneje y se construya la respuesta. Por otro lado, el middleware posterior se ejecuta después de que la solicitud es manejada por la aplicación y la respuesta ya está construida en este momento.

En nuestro caso, debemos redirigir al usuario antes de que se maneje la solicitud y, por lo tanto, se desarrollará como un middleware anterior..

Adelante y modifica el archivo. app / Http / Middleware / MobileRedirect.php con los siguientes contenidos.

mobile == "1") return redirect ('mobile-site-url-goes-here');  return $ next ($ solicitud);  

En aras de la simplicidad, solo comprobamos la existencia de la móvil parámetro de cadena de consulta, y si se establece en CIERTO, El usuario será redirigido a la URL del sitio móvil correspondiente. Por supuesto, le gustaría usar la biblioteca de detección de agente de usuario si desea detectarla en tiempo real.

Además, le gustaría reemplazar el mobile-site-url-goes-here Ruta con la ruta o URL adecuada, ya que es solo un marcador de posición para fines de demostración.

Siguiendo nuestra lógica personalizada, hay una llamada a $ siguiente ($ solicitud) Eso permite que la solicitud se siga procesando en la cadena de aplicaciones. Lo importante a tener en cuenta en nuestro caso es que hemos colocado la lógica de detección móvil antes de la $ siguiente ($ solicitud) llamada, efectivamente haciéndolo un middleware antes.

Y con eso, nuestro middleware personalizado está casi listo para ser probado. Por el momento, no hay forma de que Laravel sepa acerca de nuestro middleware. Para que esto suceda, debe registrar su middleware con la aplicación Laravel, y ese es exactamente el tema de nuestra próxima sección..

Antes de dirigirme a la siguiente sección, me gustaría demostrar cómo se ve el middleware posterior, en caso de que alguien por ahí tenga curiosidad..

Como ya habrá notado, la lógica personalizada del middleware se ejecuta después de que la solicitud Laravel procesa la solicitud. En este momento, usted tiene acceso a la $ respuesta objeto, lo que le permite manipular ciertos aspectos del mismo si desea.

Así que esa fue la historia de después del middleware..

Nuestro middleware personalizado en acción

Esta sección describe el proceso de registro del middleware con la aplicación Laravel para que pueda ser invocado durante el flujo de procesamiento de la solicitud..

Adelante, abre el archivo. aplicación / Http / Kernel.php y busca el siguiente fragmento.

/ ** * La pila de middleware HTTP global de la aplicación. * * Estos middleware se ejecutan durante cada solicitud a su aplicación. * * @var array * / protected $ middleware = [\ Illuminate \ Foundation \ Http \ Middleware \ CheckForMaintenanceMode :: class, \ Illuminate \ Foundation \ Http \ Middleware \ ValidatePostSize :: class, \ App \ Http \ Middleware \ TrimStrings :: class, \ Illuminate \ Foundation \ Http \ Middleware \ ConvertEmptyStringsToNull :: class,]; 

Como puedes ver, la $ middleware contiene la matriz de middleware que viene con la instalación predeterminada de Laravel. El middleware que se enumera aquí se ejecutará en cada solicitud de Laravel, por lo que es un candidato ideal para colocar nuestro propio middleware personalizado..

Continúe e incluya nuestro middleware personalizado como se muestra en el siguiente fragmento de código.

protected $ middleware = [\ Illuminate \ Foundation \ Http \ Middleware \ CheckForMaintenanceMode :: class, \ Illuminate \ Foundation \ Http \ Middleware \ ValidatePostSize :: class, \ App \ Http \ Middleware \ TrimStrings :: class, \ Illuminate \ Foundation \ Http \ Middleware \ ConvertEmptyStringsToNull :: class, \ App \ Http \ Middleware \ MobileRedirect :: class,]; 

Ahora, intente acceder a cualquiera de sus rutas Laravel con la cadena de consulta móvil = 1, y eso debería activar nuestro código de middleware!

Así es como se supone que debe registrar su middleware que debe ejecutarse en cada solicitud. Sin embargo, a veces desea ejecutar su middleware solo para las rutas específicas. Vamos a ver cómo lograrlo usando el $ routeMiddleware.

En el contexto de nuestro ejemplo actual, supongamos que los usuarios serán redirigidos a un sitio móvil si acceden a alguna ruta específica en su sitio. En este escenario, no desea incluir su middleware en el $ middleware lista.

En su lugar, le gustaría adjuntar el middleware directamente a la definición de ruta, como se muestra a continuación.

Route :: get ('/ hello-world', 'HelloWorldController @ index') -> middleware (\ App \ Http \ Middleware \ MobileRedirect :: class);

De hecho, podríamos ir un paso más allá y crear un alias para nuestro middleware para que no tenga que usar nombres de clase en línea.

Abre el archivo aplicación / Http / Kernel.php y busca el $ routeMiddleware que contiene las asignaciones de alias a middleware. Incluyamos nuestra entrada en esa lista, como se muestra en el siguiente fragmento de código.

protected $ routeMiddleware = ['auth' => \ Illuminate \ Auth \ Middleware \ Authenticate :: class, 'auth.basic' => \ Illuminate \ Auth \ Middleware \ AuthenticateWithBasicAuth :: class, 'bindings' => \ Illuminate \ Routing \ Middleware \ SubstituteBindings :: class, 'can' => \ Illuminate \ Auth \ Middleware \ Authorize :: class, 'guest' => \ App \ Http \ Middleware \ RedirectIfAuthenticated :: class, 'throttle' => \ Illuminate \ Routing \ Middleware \ ThrottleRequests :: class, 'mobile.redirect' => \ App \ Http \ Middleware \ MobileRedirect :: class]; 

Y la definición de ruta revisada se ve así.

Route :: get ('/ hello-world', 'HelloWorldController @ index') -> middleware ('mobile.redirect');

Y esa es la historia de registrar middleware con la aplicación Laravel. Eso fue bastante sencillo, ¿verdad??

De hecho, hemos llegado al final de este artículo y espero que lo hayas disfrutado..

Conclusión

Explorar el concepto arquitectónico en cualquier marco es siempre algo emocionante, y eso es lo que hicimos en este artículo al explorar el middleware en el marco de Laravel..

Comenzando con una introducción básica al middleware, cambiamos nuestra atención al tema de la creación de middleware personalizado en una aplicación Laravel. Y fue la segunda parte del artículo que discutió cómo registrar su middleware personalizado con Laravel, y también fue la oportunidad de explorar las diferentes formas en que podría adjuntar su middleware..

Esperemos que el viaje haya sido fructífero y que el artículo te haya ayudado a enriquecer tu conocimiento. Además, si desea que se me ocurran temas específicos en los próximos artículos, siempre podría escribirme una línea al respecto..

Eso es todo por hoy, y no dude en responder a sus consultas, si las hubiera, con la siguiente información.!