In our current implementation we are using request handlers instead of controllers in order for DotKernel to comply with the PSR-15 standard.
Currently, our structure uses modules, routes and template names.
Those are being declared in the file config/autoload/local.php in the following way:
'routes' => [
'page' => [
'about' => 'about',
'who-we-are' => 'who-we-are',
],
],
In this case page represents the module and 'about' => 'about' represents the page slug and its assigned .twig template.
To clarify, this creates a route called page.about in the page module, it loads the template file src/Page/templates/page/about.html.twig and can be accessed at /page/about.
With each request, when matching one of these routes, the PageHandler will detect the current route name and render the matching template.
Each module has a RoutesDelegator.php file (ex. src/Page/src/RoutesDelegator.php).
In this file we are retrieving the application config from the container and we loop over each module and their assigned routes.
$routes = $container->get('config')['routes'] ?? [];
foreach ($routes as $moduleName => $moduleRoutes) {
foreach ($moduleRoutes as $routeUri => $templateName) {
$app->get(
sprintf('/%s/%s', $moduleName, $routeUri),
[PageHandler::class],
sprintf('%s::%s', $moduleName, $templateName)
);
}
}