Laravel 11 incluye un mecanismo llamado Middleware, el cual nos da la habilidad de ejecutar una serie de instrucciones luego de que el usuario realice una petición y antes o después de que se procese la lógica asignada a dicha petición, la cual generalmente comienza dentro de nuestro archivo de rutas o dentro de nuestros controladores. En esta lección vamos a ver los cambios relacionados a los Middleware en la nueva versión de nuestro framework favorito y cómo podemos sacar provecho a estos para el desarrollo de nuestras aplicaciones.

Esta lección incluye un video premium

Regístrate para ver este video y cientos de lecciones exclusivas.

Uso de Middleware en Laravel

Utilizando Middleware podemos alterar, o incluso denegar, peticiones o respuestas HTTP. Por ejemplo, podemos responder con un estado 401 o 403 si el usuario no posee los permisos necesarios para realizar una cierta acción. Por esto, los Middleware son una herramienta importante para el desarrollo de aplicaciones seguras con Laravel.

Cambios a los Middleware a partir de Laravel 11

En Laravel 11, los Middleware se manejan de una manera diferente. Laravel 10 e inferior viene con una serie de Middleware por defecto en el directorio /app/Http/Middleware/ que forman parte de nuestra aplicación. A partir de Laravel 11, sin embargo, todos los Middleware por defecto ahora forman parte del núcleo del framework, es decir, están dentro de /vendor/laravel/framework/src/Illuminate/Http/Middleware/.

No debemos modificar los archivos dentro de /vendor/, puesto que cualquier cambio que hagamos dentro de este directorio será sobrescrito al actualizar nuestra aplicación.

Esto nos trae el siguiente cambio: si quisiéramos editar el uso del Middleware TrimStrings que se incluye en el framework, y que se encarga de eliminar los espacios en blanco al inicio y final de una cadena, necesitaríamos hacerlo de la siguiente manera dependiendo de la versión:

Laravel 10 o inferior

Para editar este middleware en versiones previas necesitaríamos dirigirnos al archivo TrimStrings.php dentro de /app/Http/Middleware/ y modificar su contenido directamente.

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;

class TrimStrings extends Middleware
{
    /**
     * The names of the attributes that should not be trimmed.
     *
     * @var array<int, string>
     */
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
    ];
}

Laravel 11

A partir de ahora, este Middleware se incluye como una clase dentro del núcleo de nuestra aplicación y no podemos editarlo directamente. Sin embargo, ahora tenemos un método estático con el cual podemos modificar el comportamiento del Middleware.

En el caso de TrimStrings haremos uso del método ::except() y pasaremos como argumento un arreglo con los nombres de los campos que deseamos excluir de ser procesados por el middleware.

Para esto nos dirigimos al archivo AppServiceProvider.php dentro de app/Providers/ y llamaremos al método except dentro del método boot():

public function boot(): void
{
  TrimStrings::except(['content']);
}

Si deseas modificar los Middleware disponibles en versiones anteriores del framework, solo necesitas ir al código fuente de la aplicación y asegurarte de que el Middleware de tu elección incluya algún método estático que te permita configurarlo.

Creación de Middleware personalizado

Por supuesto, aún es posible crear nuestros propios Middleware.

Para crear un middleware personalizado, primero necesitamos ejecutar el comando php artisan make:middleware [nombre del middleware], en este ejemplo lo llamaremos TestMiddleware:

php artisan make:middleware TestMiddleware

Si regresamos al editor, veremos que Laravel ha incluido el nuevo middleware por nosotros dentro del directorio /app/Http/Middleware. De esta manera solo necesitamos dirigirnos al archivo y agregar la lógica de nuestro Middleware, ya sea que queramos que se procese antes y/o después de nuestra petición:

<?php
namespace App\Http\Middleware;

use ...

class TestMiddleware
{
    /**
     * Handle on incoming request
     *
     * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
     */
    public function handle(Request $request, Closure $next): Response
    {

        // Lógica a ejecutarse antes de procesar la respuesta
        $response = $next($request);

        // Lógica a ejecutarse después de procesar la respuesta

        return $response;
    }
}

Ejecutando Middleware personalizado

Para que se ejecute este nuevo Middleware, debemos dirigirnos al archivo de rutas y llamar al método middleware() sobre la ruta objetivo, este método acepta un arreglo con el nombre completo de los diferentes Middleware que queremos aplicar en la ruta, en el caso de nuestro middleware se vería de esta manera:

Route::get('/', function() {
  return view('welcome');
})->middleware([\App\Http\Middleware\TestMiddleware::class]);

También puedes pasar el nombre de la clase sin el arreglo, si solo quieres pasar un solo Middleware.

Ejecutando Middleware personalizado en múltiples rutas

Para incluir nuestro Middleware personalizado a todas las rutas dentro de web.php, debemos dirigirnos al archivo app.php ubicado dentro del directorio bootstrap. Allí encontraremos un llamado al método withMiddleware(), el cual acepta como primer argumento una función anónima que incluye un objeto de tipo Middleware, sobre el cual podemos llamar a una serie de métodos para personalizar nuestros middleware.

Uno de estos métodos es el método web() con el cual podemos adjuntar nuestro Middleware personalizado al grupo de Middleware «web» por defecto incluidos en Laravel.

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->web(\App\Http\Middleare\TestMiddleware::class);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Personalizando los Middleware por defecto de Laravel

También podemos personalizar el Middleware que incluye Laravel a través del método withMiddleware(). El cual provee una serie de métodos para cada Middleware incluido por defecto en el framework.

Para conocer las opciones disponibles cada método, solo debemos analizar el código fuente del objeto Middleware o revisar la documentación de Laravel 11.

Por ejemplo, podemos personalizar el uso de TrimStrings de la siguiente forma:

->withMiddleware(function (Middleware $middleware) {
  $middleware->trimStrings(except: ['field_to_ignore']);
});

Agregando alias a nuestros Middleware

De manera opcional, también podemos agregar alias a nuestros Middleware utilizando el método alias(), éste acepta un arreglo asociativo donde el nombre corresponde al alias y el valor a su Middleware asociado:

->withMiddleware(function (Middleware $middleware) {
  $middleware->alias([
    'test' => \App\Http\Middleare\TestMiddleware::class,
  ]);
})

Conclusión

En Laravel 11 seguimos recibiendo los mismos mecanismos y beneficios que nos brindaba en versiones anteriores, pero con algunos cambios en la forma de configurarlos. Con estos cambios, se espera que nuestros proyectos sean más sencillos y sea más fácil para principiantes comenzar el desarrollo con Laravel.

Con esta información ya dispones del conocimiento necesario para crear aplicaciones cada vez más versátiles. Te esperamos en la siguiente lección.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Configuración de rutas en Laravel 11 Lección siguiente Manejo de excepciones en Laravel 11