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>