Lección 9 de 45 12 min de lectura

Middleware

Los middleware son filtros que inspeccionan y modifican las peticiones HTTP antes de que lleguen a tu controlador. Son perfectos para autenticación, logging o validaciones globales.

¿Qué es un middleware?

Imagina un middleware como un guardia de seguridad. Cada petición debe pasar por él antes de llegar a tu aplicación. El middleware puede dejar pasar la petición, modificarla o rechazarla.

Laravel incluye varios middleware por defecto: autenticación, protección CSRF, manejo de cookies, etc.

Crear un middleware

Usa Artisan para generar un middleware:

bash
php artisan make:middleware CheckAge

Esto crea app/Http/Middleware/CheckAge.php:

php
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

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

class CheckAge
{
    public function handle(Request $request, Closure $next): Response
    {
        if ($request->input('age') < 18) {
            return response('No autorizado', 403);
        }

        return $next($request);
    }
}

El método handle() recibe la petición y un closure $next. Si todo está bien, llama a $next($request) para continuar.

Registrar el middleware

En Laravel 11+, registra el middleware en bootstrap/app.php:

php
use App\Http\Middleware\CheckAge;

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'check.age' => CheckAge::class,
    ]);
})

Aplicar middleware a rutas

Hay varias formas de aplicar middleware:

php
// A una ruta individual
Route::get('/adultos', function () {
    return 'Contenido para adultos';
})->middleware('check.age');

// A un grupo de rutas
Route::middleware(['check.age'])->group(function () {
    Route::get('/bar', function () { /* ... */ });
    Route::get('/casino', function () { /* ... */ });
});

Middleware con parámetros

Puedes pasar parámetros al middleware:

php
// En el middleware
public function handle(Request $request, Closure $next, int $minAge): Response
{
    if ($request->input('age') < $minAge) {
        return response('No autorizado', 403);
    }

    return $next($request);
}

// En la ruta
Route::get('/bar', function () {
    return 'Bienvenido al bar';
})->middleware('check.age:21');

Middleware globales

Algunos middleware se aplican a todas las peticiones. Se configuran en bootstrap/app.php:

php
->withMiddleware(function (Middleware $middleware) {
    $middleware->append(LogRequests::class);
})
Middleware incluidos

Laravel incluye middleware como auth (autenticación), throttle (límite de peticiones) y verified (email verificado).

Ejercicios

Ejercicio 1: Middleware de logging

Crea un middleware LogRequest que escriba en el log la URL y el método de cada petición.

Ver solución
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;

class LogRequest
{
    public function handle(Request $request, Closure $next): Response
    {
        Log::info('Petición recibida', [
            'url' => $request->url(),
            'method' => $request->method(),
        ]);

        return $next($request);
    }
}

Ejercicio 2: Middleware de mantenimiento

Crea un middleware que devuelva "Sitio en mantenimiento" con código 503 si existe un archivo storage/maintenance.

Ver solución
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\Response;

class CheckMaintenance
{
    public function handle(Request $request, Closure $next): Response
    {
        if (file_exists(storage_path('maintenance'))) {
            return response('Sitio en mantenimiento', 503);
        }

        return $next($request);
    }
}

Ejercicio 3: Middleware con parámetro de rol

Crea un middleware que reciba un parámetro role y solo permita el acceso si el query string contiene ?role=admin (o el rol especificado).

Ver solución
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

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

class CheckRole
{
    public function handle(Request $request, Closure $next, string $role): Response
    {
        if ($request->query('role') !== $role) {
            return response('Acceso denegado', 403);
        }

        return $next($request);
    }
}

// Uso: Route::get('/admin', ...)->middleware('check.role:admin');

Resumen

En esta lección aprendiste:

  • Los middleware filtran peticiones antes de llegar al controlador
  • php artisan make:middleware genera middleware
  • Se registran en bootstrap/app.php (Laravel 11+)
  • ->middleware('nombre') aplica a rutas
  • Pueden recibir parámetros con middleware('nombre:param')

En la siguiente lección aprenderás a usar Artisan CLI, la herramienta de línea de comandos de Laravel.

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales, soporte personalizado y certificado.

Descubrir cursos premium