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.
- 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.
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);
}
}
- $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)".
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']);
...
});
public function middleware(Request $request){
return response()->json(['middleware'=>$request->mensajeOculto]);
}
}