---
title: "Aprende Laravel: Middleware"
excerpt: "Aprende qué es el middleware en Laravel y cómo usarlo: crear el tuyo, el método handle con $next, asignarlo a rutas, grupos, alias y pasarle parámetros."
date: "2026-07-20T10:00:00.000Z"
category: "Laravel"
author:
  name: "angel cruz"
  picture: "https://angelcruzdevcdn.nyc3.cdn.digitaloceanspaces.com/images/me/angel-cruz.png"
ogImage:
  url: "/images/open-graph/laravel-opengraph-image.png"
seo_title: "Middleware en Laravel 13: crear, registrar y asignar (guía)"
seo_description: "Aprende middleware en Laravel 13: qué es, cómo crear uno con make:middleware, el método handle con $next, asignarlo a rutas, grupos web/api, alias y parámetros."
keywords:
  - laravel
  - middleware
  - php
  - handle
  - laravel español
learning_path:
  series: "laravel-fundamentals"
  order: 9
  total: 13
  prev_slug: "aprende-laravel-autenticacion"
  next_slug: "aprende-laravel-testing-pest"
---

En el post de [autenticación](/post/aprende-laravel-autenticacion) usaste el middleware `auth` para proteger rutas. Ahora vas a entender qué es y a escribir el tuyo. **Un middleware es una capa por la que pasa cada petición HTTP antes (o después) de llegar a tu aplicación**: puede inspeccionarla, modificarla o rechazarla. El ejemplo clásico es justamente `auth`: si no hay sesión, redirige al login; si la hay, deja pasar.

## Cómo funciona: capas alrededor de la petición

Imagina la petición atravesando una serie de capas. Cada middleware decide si la deja avanzar (llamando a `$next`) o la corta (devolviendo una respuesta). Se crea con Artisan:

```shell
php artisan make:middleware EnsureTokenIsValid
```

Se genera en `app/Http/Middleware` con el método `handle`:

```php
<?php

namespace App\Http\Middleware;

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

class EnsureTokenIsValid
{
    public function handle(Request $request, Closure $next): Response
    {
        if ($request->input('token') !== 'mi-token-secreto') {
            return redirect('/home');
        }

        return $next($request);
    }
}
```

La regla clave: `return $next($request)` **pasa** la petición a la siguiente capa; devolver una respuesta (como el `redirect`) la **corta** ahí mismo.

## Antes o después de la aplicación

Un middleware puede actuar antes de que la app procese la petición, o después:

```php
// ANTES: actúa y luego deja pasar
public function handle(Request $request, Closure $next): Response
{
    // hacer algo con la petición...
    return $next($request);
}

// DESPUÉS: deja pasar y luego actúa sobre la respuesta
public function handle(Request $request, Closure $next): Response
{
    $response = $next($request);
    // hacer algo con la respuesta...
    return $response;
}
```

## Asignar middleware a rutas

Lo más común es aplicarlo a rutas concretas con `->middleware()`:

```php
use App\Http\Middleware\EnsureTokenIsValid;

Route::get('/perfil', function () {
    // ...
})->middleware(EnsureTokenIsValid::class);

// Varios a la vez:
Route::get('/', fn () => ...)->middleware([First::class, Second::class]);
```

## Grupos y alias

Laravel trae dos grupos predefinidos, **`web`** y **`api`**, que aplica automáticamente a `routes/web.php` y `routes/api.php`. El grupo `web` incluye sesión, cookies, errores compartidos y protección contra CSRF.

Además, varios middleware del framework tienen **alias** cortos que ya usaste sin saberlo:

| Alias | Middleware |
|-------|------------|
| `auth` | Authenticate |
| `guest` | RedirectIfAuthenticated |
| `verified` | EnsureEmailIsVerified |
| `can` | Authorize |
| `throttle` | ThrottleRequests |
| `signed` | ValidateSignature |

Puedes definir tus propios alias en `bootstrap/app.php` (en Laravel 13 la configuración de middleware vive ahí, ya no en `Http/Kernel.php`):

```php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->alias([
        'subscribed' => EnsureUserIsSubscribed::class,
    ]);
})
```

Y registrarlo global (corre en cada petición) con `append`:

```php
->withMiddleware(function (Middleware $middleware): void {
    $middleware->append(EnsureTokenIsValid::class);
})
```

## Pasar parámetros al middleware

Un middleware puede recibir argumentos extra después de `$next`. El caso típico es verificar un rol:

```php
public function handle(Request $request, Closure $next, string $role): Response
{
    if (! $request->user()->hasRole($role)) {
        // redirigir o abortar...
    }

    return $next($request);
}
```

Se pasan en la ruta separando con `:` y comas:

```php
Route::put('/post/{id}', function (string $id) {
    // ...
})->middleware(EnsureUserHasRole::class.':editor');
```

## Siguiente Paso

Ya sabes filtrar peticiones. El último fundamento (y el que separa el código que aguanta del que no) es asegurarte de que todo funciona: los tests. Sigue con [Aprende Laravel: Testing con Pest](/post/aprende-laravel-testing-pest).

## Preguntas Frecuentes

### ¿Qué es un middleware en Laravel?

Una capa que inspecciona o filtra cada petición HTTP antes (o después) de que llegue a tu aplicación. Puede dejarla pasar (`$next($request)`) o cortarla devolviendo una respuesta. El middleware `auth` es el ejemplo más conocido.

### ¿Cómo creo un middleware?

Con `php artisan make:middleware NombreDelMiddleware`. Se genera en `app/Http/Middleware` con un método `handle(Request $request, Closure $next)`.

### ¿Dónde se registra el middleware en Laravel 13?

En `bootstrap/app.php`, dentro de `->withMiddleware(...)`. En versiones anteriores se hacía en `app/Http/Kernel.php`, que ya no existe en Laravel 11+.

### ¿Cómo aplico un middleware solo a algunas rutas?

Con `->middleware(MiMiddleware::class)` en la ruta o el grupo. Para excluirlo de una ruta dentro de un grupo, usa `->withoutMiddleware([...])`.

### ¿Puedo pasarle parámetros a un middleware?

Sí. Se declaran en `handle()` después de `$next` y se pasan en la ruta con `MiMiddleware::class.':valor'` (varios separados por comas).

## Recursos Adicionales

- [Middleware | Laravel 13.x](https://laravel.com/docs/13.x/middleware)
- [Aprende Laravel: Rutas](/post/aprende-laravel-rutas)
- [Aprende Laravel desde cero (serie completa)](/laravel-fundamentals)

---

## Sitemap

Índice completo del sitio: [/sitemap.md](https://www.angelcruz.dev/sitemap.md)

Canónico HTML: [https://www.angelcruz.dev/post/aprende-laravel-middleware](https://www.angelcruz.dev/post/aprende-laravel-middleware)
