COMO CREAR UN MIDDLEWARE EN LARAVEL

Un middleware en Laravel es una capa de código que actúa como un filtro o intermediario entre una solicitud HTTP entrante y la respuesta que genera la aplicación. Se utiliza para procesar las solicitudes antes de que lleguen a las rutas o controladores, o para modificar la respuesta antes de que se envíe al cliente. En esencia, los middlewares permiten ejecutar lógica adicional, como autenticación, validación, registro, o manipulación de solicitudes y respuestas.

¿Cómo funciona un middleware en Laravel?

  • Solicitud entrante: Cuando un cliente (como un navegador) envía una solicitud HTTP a tu aplicación Laravel, el middleware intercepta esta solicitud antes de que se procese en las rutas o controladores.
  • Procesamiento: El middleware puede realizar tareas como verificar si el usuario está autenticado, registrar información, modificar la solicitud, o incluso detener el flujo si no se cumplen ciertas condiciones.
  • Respuesta saliente: Después de que la solicitud se procesa (por ejemplo, en un controlador), el middleware puede modificar la respuesta antes de que se envíe al cliente.

Ejemplos de middlewares en Laravel

  • Middleware de autenticación: Perifica si el usuario está autenticado. Si no lo está, redirige a la página de login para proteger rutas para que solo usuarios autenticados puedan acceder.
  • Middleware de verificación de CSRF: Protege contra ataques CSRF asegurando que las solicitudes POST incluyan un token válido.
  • Middleware de sesiones: Gestiona las sesiones de usuario. Este middleware actualiza la tabla sessions en cada solicitud.
  • Middleware personalizado: Se pueden crear middlewares para tareas específicas, como verificar roles de usuario, registrar solicitudes, o limitar el acceso según ciertas condiciones.
Para crear un middleware en Laravel hay que ejecutar el comando "php artisan make:middleware NombreMiddleware". Esto creará el fchero "NombreMiddleware" dentro de la carpeta "Middleware" en "App". Ejemplo de un middleware en Laravel:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class NombreMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $request->mensajeOculto = 'Soy un mensaje del middleware';
        return $next($request);
    }
}
Explicación:
  • $request: Contiene los datos de la solicitud HTTP (como parámetros, encabezados, etc.).
  • $next: Pasa la solicitud al siguiente middleware o al controlador si no hay más middlewares.
  • return: Puede devolver una respuesta modificada, una redirección, o el resultado de "$next($request)".
El ejemplo anterior es un ejemplo sencillo que guarda en el objeto request un mensaje para ver que se ha ejecutado el middleware antes de redirigir a la ruta.
Una vez creado el Middleware hay que introducir en que rutas se va a usar este Middleware, dentro del fichero de rutas (web, api, o la que sea):

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
use App\Http\Middleware\PruebaMiddleware;

...

Route::middleware([PruebaMiddleware::class])->group(function(){
           Route::get('/middleware',[UserController::Class,'middleware']);
         ...
});
En el código anterior se añade un grupo de rutas donde se aplicará el middleware. Ahora dentro del controlador, en el ejemplo, sería "UserController" y en el método "middleware", es por crear el ejmplo, se hará:

 public function middleware(Request $request){
              return response()->json(['middleware'=>$request->mensajeOculto]);
    }
}
Como podéis ver se mostrará el mensaje creado en el ejemplo del middleware.