Routering
Routes in Finch worden gedefinieerd met FinchRoute-objecten die zijn verzameld in een routeringsfunctie. De routeringsfunctie wordt geregistreerd met app.addRouting() en wordt aangeroepen voor elk binnenkomend verzoek.
Routeringsfunctie
import 'package:finch/finch_route.dart';
import '../controllers/home_controller.dart';
final homeController = HomeController();
Future<List<FinchRoute>> getWebRoute(Request rq) async {
return [
FinchRoute(
key: 'root',
path: '/',
methods: Methods.ONLY_GET,
index: homeController.index,
),
];
}
Registreer het in app.dart:
app.addRouting(getWebRoute);
FinchRoute-parameters
| Parameter | Type | Beschrijving |
|---|---|---|
key |
String |
Unieke route-identificator. Gebruikt voor URL-generatie ($e.routeUrl('key')) |
path |
String |
URL-padsegment. Ondersteunt {param} en wildcard * |
methods |
List<String> |
Toegestane HTTP-methoden. Gebruik Methods-constanten |
index |
Future<String> Function()? |
Handlerfunctie (geen rq-parameter; gebruik Context.rq of een controllermethode) |
controller |
Controller? |
Controller-instantie. index() wordt aangeroepen als index niet is ingesteld |
children |
List<FinchRoute> |
Geneste kindroutes. Pad is relatief ten opzichte van de ouder |
extraPath |
List<String> |
Extra paden die naar dezelfde route verwijzen |
auth |
AuthController? |
Authenticatiebeveiliging voor deze route |
permissions |
List<String> |
Permissiestrings die na auth worden gecontroleerd |
middlewares |
List<Middleware> |
Middleware-keten die vóór de handler wordt uitgevoerd |
hosts |
List<String> |
Beperk tot specifieke hostnamen (['*'] = alle) |
ports |
List<int> |
Beperk tot specifieke poorten ([] = alle) |
params |
Map<String, dynamic> |
Standaard sjabloonparameters |
excludePaths |
List<String> |
Subpaden die zijn uitgesloten van deze route |
apiDoc |
Future<ApiDoc>? Function()? |
API-documentatie voor Swagger |
HTTP-methoden
Methods.ONLY_GET // ['GET']
Methods.ONLY_POST // ['POST']
Methods.ONLY_PUT // ['PUT']
Methods.ONLY_DELETE // ['DELETE']
Methods.GET_POST // ['POST', 'GET']
Methods.ALL // Alle standaard HTTP-methoden
// Of een aangepaste lijst:
methods: [Methods.GET, Methods.POST, Methods.DELETE]
Padparameters
Gebruik de {name}-syntaxis om URL-segmenten vast te leggen. Lees ze in de controller met rq.getParam('name'):
FinchRoute(
key: 'users.show',
path: 'users/{id}',
methods: Methods.ONLY_GET,
index: userController.show,
),
// In UserController:
Future<String> show() async {
var id = rq.getParam('id');
return rq.renderData(data: {'id': id});
}
Geneste routes (children)
Kindpadden zijn relatief ten opzichte van het bovenliggende pad:
FinchRoute(
key: 'example',
path: 'example',
index: homeController.redirectToRoot,
children: [
FinchRoute(
key: 'example.form.get',
path: 'form',
methods: Methods.ONLY_GET,
index: homeController.exampleForm,
),
FinchRoute(
key: 'example.panel',
path: 'panel',
methods: Methods.ALL,
auth: authController,
permissions: ['admin'],
index: homeController.exampleAuth,
),
],
),
Extra paden
extraPath koppelt extra URL-prefixen aan dezelfde route:
FinchRoute(
key: 'root.mysql',
path: 'example/mysql',
extraPath: ['api/example/mysql'],
methods: Methods.GET_POST,
index: homeController.exampleMysql,
),
Host- en poortfiltering
Beperk een route tot specifieke hosts of poorten:
FinchRoute(
key: 'root.localhost',
path: 'example/host',
hosts: ['localhost'],
ports: [80, 8085],
index: homeController.renderLocalhost,
methods: Methods.ALL,
),
Authenticatiebeveiliging
Koppel een AuthController om een route te beveiligen. Als auth() false retourneert, wordt het verzoek afgewezen voordat het de handler bereikt:
FinchRoute(
key: 'admin.panel',
path: 'admin/panel',
auth: AppAuthController(),
permissions: ['admin'],
index: adminController.panel,
),
Zie Auth Controller voor implementatiedetails.
Route-caching
Gebruik de .cache()-extensie om antwoorden te cachen:
FinchRoute(
key: 'root.route',
path: 'example/route',
methods: Methods.ONLY_GET,
index: homeController.exampleRoute,
).cache(
cacheDuration: Duration(minutes: 10),
cacheType: [CacheParam.path, CacheParam.method, CacheParam.language],
cacheSource: CacheSource.file,
),
Zie Route Cache voor volledige details.
URL's genereren vanuit routesleutels
Gebruik in sjablonen $e.routeUrl('key') om URL's te genereren:
<a href="{{ $e.routeUrl('root') }}">Startpagina</a>
<a href="{{ $e.routeUrl('users.show', {'id': user.id}) }}">Gebruiker tonen</a>