Pular para o conteúdo principal

Middleware

O Vaden oferece um sistema de middleware poderoso construído sobre o pipeline do Shelf. Ele permite transformações de requisição/resposta, autenticação, registro de logs, manipulação de cabeçalhos e muito mais — globalmente ou por rota.

Middlewares Globais com Pipeline

Para definir middlewares que se aplicam a todas as requisições, use o Pipeline dentro da sua classe @Configuration():

()
class AppConfiguration {
()
ApplicationSettings settings() {
return ApplicationSettings.load('application.yaml');
}

()
Pipeline globalMiddleware(ApplicationSettings settings) {
return Pipeline()
.addMiddleware(cors(allowedOrigins: ['*']))
.addVadenMiddleware(EnforceJsonContentType())
.addMiddleware(logRequests());
}
}
  • addMiddleware(...) adiciona qualquer middleware do Shelf.
  • addVadenMiddleware(...) adiciona um middleware compatível com Vaden.

Esses middlewares são executados antes de qualquer lógica de controlador.

Middleware em Nível de Rota

Você pode aplicar middleware a controladores específicos ou até rotas individuais usando a anotação @UseMiddleware:

([LoggerMiddleware])
('/users')
class UserController {
('/')
Response list() => Response.ok('Users');
}

Você também pode anotar um método específico:

([LoggerMiddleware])
('/profile')
Response getProfile() => Response.ok('Profile');

Classes de middleware devem implementar a seguinte interface:

class MyMiddleware implements Middleware {
FutureOr<Response> handle(Request request, Handler next) async {
return next(request);
}
}

Guards

Guards são um tipo especial de middleware usado para controle de acesso. Você pode aplicá-los como middleware regular usando @UseGuards:

([AuthGuard])
('/admin')
class AdminController {
('/dashboard')
Response dashboard() => Response.ok('Admin');
}

Um guard deve estender Guard, que por sua vez implementa Middleware:

class MyGuard extends Guard {
FutureOr<bool> canActivate(Request request) async {
return true;
}
}

Ordem dos Middlewares

A ordem de execução dos middlewares segue este padrão:

  • Middlewares globais do Pipeline em AppConfiguration.
  • Middlewares em nível de Controlador com @UseMiddleware.
  • Middlewares em nível de Método com @UseMiddleware.
  • Guards via @UseGuards são sempre aplicados antes de qualquer lógica de rota.

Esta abordagem em camadas garante uma separação clara de responsabilidades e controle flexível de requisições.