Mejorando los middlewares de Laravel: Dominando el middleware parametrizado
- Publicado el 05 noviembre, 2024
- Palabras: 514
En el mundo del desarrollo de aplicaciones web, la flexibilidad es clave. El sistema de middleware de Laravel ya es potente, pero ¿sabías que puedes hacerlo aún más dinámico al pasar parámetros? Esta característica te permite crear middleware reutilizable que puede adaptar su comportamiento en función de los parámetros que proporciones. Veamos cómo puedes aprovechar esta potente característica en tus aplicaciones de Laravel.

#Entiendo el middleware parametrizado
El middleware parametrizado en Laravel le permite pasar datos adicionales a su middleware en el punto de uso. Esto es particularmente útil cuando desea reutilizar una parte de la lógica del middleware pero modificar ligeramente su comportamiento en diferentes contextos.
#Creación de un middleware parametrizado
Veamos un ejemplo de un middleware que garantiza que un usuario tenga un rol específico:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use SymfonyComponentHttpFoundationResponse;
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string $role): Response
{
if (! $request->user()->hasRole($role)) {
return redirect('home')->with('error', 'You do not have the right permissions.');
}
return $next($request);
}
}
En este middleware, $role es un parámetro que pasaremos al aplicar el middleware a una ruta.
#Usar el middleware parametrizado
Puede utilizar este middleware en su archivo de rutas de la siguiente manera:
use AppHttpMiddlewareEnsureUserHasRole;
Route::put('/post/{id}', function (string $id) {
// Update post logic here
})->middleware(EnsureUserHasRole::class.':editor');
Aquí, especificamos que el usuario debe tener el rol de "editor" para acceder a esta ruta.
Incluso puedes pasar varios parámetros:
Route::put('/post/{id}', function (string $id) {
// Update post logic here
})->middleware(EnsureUserHasRole::class.':editor,publisher');
Esto permitiría a los usuarios con el rol de "editor" o "publicador" acceder a la ruta.
#Ejemplo práctico
Ampliemos nuestro middleware EnsureUserHasRole para crear un sistema de control de acceso basado en roles más completo:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use SymfonyComponentHttpFoundationResponse;
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string ...$roles): Response
{
if (! $request->user() || ! $request->user()->hasAnyRole($roles)) {
return response()->json(['error' => 'Unauthorized'], 403);
}
return $next($request);
}
}
Ahora, usemos este middleware en nuestras rutas:
use AppHttpControllersPostController;
use AppHttpMiddlewareEnsureUserHasRole;
Route::prefix('posts')->group(function () {
Route::get('/', [PostController::class, 'index']);
Route::post('/', [PostController::class, 'store'])
->middleware(EnsureUserHasRole::class.':editor,admin');
Route::put('/{id}', [PostController::class, 'update'])
->middleware(EnsureUserHasRole::class.':editor,admin');
Route::delete('/{id}', [PostController::class, 'destroy'])
->middleware(EnsureUserHasRole::class.':admin');
});
En esta configuración:
- Cualquiera puede ver las publicaciones
- Los editores y administradores pueden crear y actualizar publicaciones
- Solo los administradores pueden eliminar publicaciones
Así es como podrían verse las respuestas:
// GET /posts
// Accessible to all
[
{ "id": 1, "title": "First Post", "content": "..." },
{ "id": 2, "title": "Second Post", "content": "..." }
]
// POST /posts (as editor)
// Success:
{
"id": 3,
"title": "New Post",
"content": "...",
"created_at": "2023-06-15T12:00:00.000000Z"
}
// DELETE /posts/1 (as editor)
// Failure:
{
"error": "Unauthorized"
}
// DELETE /posts/1 (as admin)
// Success:
{
"message": "Post deleted successfully"
}
Si domina el middleware parametrizado en Laravel, podrá crear aplicaciones más flexibles, reutilizables y fáciles de mantener. Esta potente función le permite implementar una lógica compleja de autorización y filtrado, manteniendo su código DRY (Don't Repeat Yourself) y sus rutas limpias y legibles.
Fuente: Harris Raftopoulos
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión