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');