Nueva forma de agregar middleware a los controladores de Laravel

Spread the love

En Laravel es posible resolver un middleware desde los controladores, por ejemplo podemos tener algo como lo siguiente:

public function __construct()
{
    $this->middleware('auth');
}

Como puedes ver, podemos resolver un middleware desde el constructor del controlador usando el método middleware().

Pero el problema con este enfoque es que el middleware se resolverá cada vez que se instancie el controlador. Por lo tanto, si tienes un controlador con 10 métodos, el middleware se resolverá 10 veces.

El método middleware()

Para mitigar este problema, Laravel 9 introdujo una nueva forma de resolver los middleware de forma estática desde los controladores.

Veamos cómo funciona con un ejemplo.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;

class UserController extends Controller implements HasMiddleware
{
    public static function middleware()
    {
        return [
            (new Middleware('auth')),
        ];
    }

    public function index()
    {
        //
    }
}

Como puedes ver

Ahora podemos resolver los middleware estáticamente desde los controladores usando el método middleware().

Además, tenemos que asegurarnos de que el controlador implementa la interfaz HasMiddleware. Esto es necesario para decirle a Laravel que el controlador tiene middlewares que necesitan ser resueltos estáticamente.

Resolución múltiple

Ahora, si quieres resolver múltiples middlewares desde el controlador, puedes hacerlo así.

public static function middleware()
{
    return [
        (new Middleware('auth')),
        (new Middleware('role:admin')),
    ];
}

También puede resolver los middleware con los métodos only y except de la siguiente manera.

public static function middleware()
{
    return [
        (new Middleware('auth'))->only('index'),
        (new Middleware('role:admin'))->except('show'),
    ];

Y es todo amigos, espero que esta nueva forma te sea de utilidad en los nuevos proyectos que lleves a cabo en Laravel 9.