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