Route Event Hooks
RoutingServiceProvider emits a series of events around every request. The
example under examples/route_events/ prints them to stdout so you can see the
order and payloads.
The event manager is registered by
RoutingServiceProvider. Include that typed provider when composing a slim engine;Engine.create()with the normal defaults includes it already.
Available events
BeforeRoutingEvent– fired before route matching begins.RouteMatchedEvent– the request matched a route (includes theEngineRoute).RouteNotFoundEvent– nothing matched; typically results in a 404.RoutingErrorEvent– a handler threw; inspect theerrorandstackTrace.AfterRoutingEvent– always fired after routing (even on errors) with the final response status.
Example
examples/route_events/bin/server.dart
import 'package:routed/routed.dart';
import 'package:routed/routed.dart';
Future<void> main(List<String> args) async {
final engine = await Engine.create(providers: Engine.defaultProviders);
final events = await engine.make<EventManager>();
events.listen((BeforeRoutingEvent event) {
print('[before] ${event.context.request.method} ${event.context.request.uri}');
});
events.listen((RouteMatchedEvent event) {
print('[matched] ${event.route.name ?? '-'}');
});
events.listen((RouteNotFoundEvent event) {
print('[not-found] ${event.context.request.path}');
});
events.listen((RoutingErrorEvent event) {
print('[error] ${event.error}');
});
events.listen((AfterRoutingEvent event) {
print('[after] status ${event.context.response.statusCode}');
});
engine.get('/', (ctx) => ctx.string('hello')).name('home');
engine.get('/boom', (ctx) => throw StateError('Boom!'));
await engine.serve(host: '127.0.0.1', port: 8081);
}
Run it and hit:
GET / # triggers before/matched/after
GET /boom # triggers before/matched/error/after
GET /missing # triggers before/not-found/after
Because these events are normal Dart streams you can attach logging, instrumentation, tracing, or metrics collectors without modifying your handlers.