Controllers

Een controller is een Dart-klasse die Controller uitbreidt en gerelateerde verzoekhandlers groepeert. Elke handlermethode retourneert Future<String> — de body van het HTTP-antwoord.

Een controller aanmaken

import 'package:finch/finch_route.dart';

class UserController extends Controller {
  UserController();

  @override
  Future<String> index() async {
    return rq.renderData(data: {'message': 'User list'});
  }

  Future<String> show() async {
    var id = rq.getParam('id');
    return rq.renderData(data: {'id': id});
  }

  Future<String> profile() async {
    rq.addParam('title', 'User Profile');
    return rq.renderView(path: 'user/profile');
  }
}

Het rq-object

Binnen elke subklasse van Controller is rq een getter die Context.rq teruggeeft — het huidige Request-object. Het geeft toegang tot verzoekgegevens, sessie, cookies en alle antwoordmethoden.

Een controller koppelen aan een route

final userController = UserController();

FinchRoute(
  key: 'users.index',
  path: 'users',
  methods: Methods.ONLY_GET,
  controller: userController,  // roept userController.index() aan
),
FinchRoute(
  key: 'users.show',
  path: 'users/{id}',
  methods: Methods.ONLY_GET,
  index: userController.show,  // roept een specifieke methode aan
),

controller gebruikt de index()-methode. index accepteert een Future<String> Function()? — geef een methodereferentie van de controller door om een andere actie aan te roepen.

Antwoordmethoden

Alle antwoordmethoden bevinden zich op het rq-object:

Methode Beschrijving
rq.renderView(path: 'template/path') Render een Jinja-sjabloon vanuit widgetsPath
rq.renderData(data: {...}) JSON-antwoord
rq.renderString(text: '...') Antwoord in platte tekst
rq.renderHtml(html: '...') HTML-antwoord (string)
rq.renderTag(tag: Tag) Render een Htmler-Tag
rq.renderError(404) Standaard foutantwoord
rq.redirect('/path') HTTP-doorverwijzing
rq.renderSSE(stream) Server-Sent Events-stream
rq.renderSocket() WebSocket-handshake (placeholder)

renderView

Future<String> dashboard() async {
  rq.addParams({
    'title': 'Dashboard',
    'user': currentUser,
  });
  return rq.renderView(path: 'pages/dashboard');
  // Laadt: widgetsPath/pages/dashboard.{widgetsType}
}

renderData (JSON)

Future<String> apiUsers() async {
  var users = await UserCollection().getAll();
  return rq.renderData(data: {'users': users.map((u) => u.toJson()).toList()});
}

renderError

Future<String> notFound() async {
  return rq.renderError(404);
}

Verzoekgegevens lezen

// Lees een GET- of POST-veld
var name = rq.get<String>('name', def: 'anonymous');
var age  = rq.get<int>('age', def: 0);

// Lees een padparameter uit {id}
var id = rq.getParam('id');

// Controleer de verzoekmethode
if (rq.isPost) { ... }
if (rq.method == Methods.DELETE) { ... }

// API-endpoint? (pad begint met /api/)
bool isApi = rq.isApiEndpoint;

Gegevens doorgeven aan sjablonen

Future<String> show() async {
  var user = await UserCollection().findById(rq.getParam('id'));

  // addParam / addParams maakt gegevens beschikbaar in Jinja-sjablonen
  rq.addParams({
    'user': user?.toJson(),
    'title': 'User Profile',
  });

  return rq.renderView(path: 'user/show');
}

In het sjabloon:

<h1>{{ user.name }}</h1>

Toegang tot andere controllers

Controllers zijn gewone Dart-objecten. Instantieer ze op het hoogste niveau en deel ze:

final authController = AppAuthController();
final homeController = HomeController();

// In AuthController.loginPost():
return homeController.renderView('example/form');