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 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.
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