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 
@UseGuardssã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.