Middleware como controlador avanzado en Laravel: uso de la interfaz HasMiddleware

  • Publicado el 22 noviembre, 2024
  • Palabras: 111

¿Alguna vez has deseado poder mantener la lógica de tu middleware más cerca de tus controladores? La interfaz HasMiddleware de Laravel ofrece una forma nueva y elegante de asignar middleware directamente en las clases de tu controlador. ¡Exploremos esta poderosa característica!

Middleware como controlador avanzado en Laravel: uso de la interfaz HasMiddleware

#Middleware de forma tradicional

Tradicionalmente, hemos asignado middleware en nuestros archivos de ruta:

 

Route::get('/profile', [UserController::class, 'show'])->middleware('auth');

 

#Uso de la interfaz HasMiddleware 

Ahora, Laravel ofrece un enfoque más organizado. Al implementar la interfaz HasMiddleware, puedes definir middleware directamente en tu controlador:

 

use AppHttpControllersController;
use IlluminateRoutingControllersHasMiddleware;
use IlluminateRoutingControllersMiddleware;

class UserController extends Controller implements HasMiddleware
{
    public static function middleware(): array
    {
        return [
            'auth',
            new Middleware('log', only: ['index']),
            new Middleware('subscribed', except: ['store']),
        ];
    }
}

 

#Diferentes formas de definir el middleware

  • De forma sencilla

 

'auth'  // Se aplica a todas las acciones de los controladores

 

  • Middleware con restricciones

 

new Middleware('log', only: ['index'])  // Solo para el método index
new Middleware('subscribed', except: ['store'])  // A todos los métodos excepto el store

 

  • Mediante un clousure

 

use Closure;
use IlluminateHttpRequest;

public static function middleware(): array
{
    return [
        function (Request $request, Closure $next) {
            // Your middleware logic here
            return $next($request);
        }
    ];
}

 

#Ejemplo práctico

A continuación se muestra un ejemplo práctico de un controlador que administra las suscripciones de los usuarios:

 

use AppHttpControllersController;
use IlluminateRoutingControllersHasMiddleware;
use IlluminateRoutingControllersMiddleware;
use IlluminateHttpRequest;
use Closure;

class SubscriptionController extends Controller implements HasMiddleware
{
    public static function middleware(): array
    {
        return [
            'auth',  // Ensure user is logged in
            new Middleware('verified', only: ['upgrade', 'cancel']),  // Email verified for important actions
            new Middleware('subscribed', except: ['pricing', 'subscribe']),  // Check subscription status
            function (Request $request, Closure $next) {
                if ($request->user()->onGracePeriod()) {
                    // Add grace period warning to response
                    $response = $next($request);
                    $response->with('warning', 'Your subscription is ending soon!');
                    return $response;
                }
                return $next($request);
            }
        ];
    }

    public function upgrade()
    {
        // Upgrade subscription logic
    }

    public function cancel()
    {
        // Cancel subscription logic
    }
}

 

El uso de la interfaz HasMiddleware y el mantenimiento de las definiciones de middleware en las clases de controlador pueden generar un código más limpio y fácil de mantener. Es especialmente útil para controladores complejos que necesitan diferentes reglas de middleware para diferentes acciones.

Antonio Jenaro
Antonio Jenaro

Web Developer

Archivado en:

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