Controllers

Controllers encapsuleren de verzoekafhandelingslogica in Finch. Een controller is een klasse die Controller uitbreidt en toegang biedt tot het huidige verzoekobject via rq.

Basisstructuur

import 'package:finch/finch_route.dart';

class HomeController extends Controller {
  Future<String> index() async {
    return rq.renderView(path: 'home/index');
  }
}

Gebruik de controller in de routering:

final homeController = HomeController();

FinchRoute(
  key: 'root',
  path: '/',
  methods: Methods.ONLY_GET,
  index: homeController.index,
),

Het rq-object

rq (afkorting van request) is het centrale object dat beschikbaar is in elke controllermethode. Het biedt toegang tot verzoekgegevens, antwoordmethoden, sessie, cookies, taal en meer.

Antwoordmethoden

Methode Beschrijving
rq.renderView(path: '...') Render een Jinja-sjabloon. Pad is relatief ten opzichte van widgetsPath
rq.renderData(data: {...}) Geef een JSON-antwoord terug
rq.renderError(status: 404) Stuur een HTTP-foutantwoord
rq.renderString(text: '...') Geef platte tekst of HTML terug
rq.redirect(url: '...') Doorsturen naar URL
rq.renderNotFound() Geef 404 terug

Een sjabloon renderen

Future<String> index() async {
  return rq.renderView(
    path: 'home/index',        // Pad relatief aan widgetsPath zonder extensie
    params: {
      'title': 'Startpagina',
      'user': currentUser,
    },
  );
}

JSON teruggeven

Future<String> apiUser() async {
  var id = rq.getParam('id');
  var user = await UserModel().find(id: id);
  return rq.renderData(data: user?.toJson() ?? {});
}

Verzoekgegevens lezen

// Query/formulierparameters
var name = rq.get<String>('name', def: '');
var age  = rq.get<int>('age', def: 0);

// Padparameters (/users/{id})
var id   = rq.getParam('id');

// Ruwe JSON-body
var body = await rq.getBodyAsJson();

// Geüpload bestand
var file = rq.getFile('avatar');

Verzoekeigenschappen

rq.method           // 'GET', 'POST', …
rq.path             // '/users/42'
rq.ip               // IP-adres van de client
rq.headers          // Map<String, List<String>>
rq.isJson           // Of Content-Type application/json is
rq.currentLanguage  // Huidige taalcode

Gegevens aan het sjabloon doorgeven

Naast params in de renderView-methode kun je ook parameters opgeven voor de hele route in de FinchRoute-definitie:

FinchRoute(
  key: 'root',
  path: '/',
  params: {'siteName': 'Finch Demo'},
  index: homeController.index,
),

Gegevens op routeniveau worden samengevoegd met gegevens op controllerniveau in renderView.

HTTP-fouten

// Stuur 403 Forbidden
return rq.renderError(status: 403, message: 'Toegang geweigerd');

// Stuur 500 Internal Server Error
return rq.renderError(status: 500);