Cuando tu aplicación crezca y tengas muchos controladores, puede ser una buena idea agruparlos de forma lógica:
// define los controladores de un blog
$blog = $app['controllers_factory'];
$blog->get('/', function () {
return 'Portada del blog';
});
// ...
// define los controladores de un foro
$forum = $app['controllers_factory'];
$forum->get('/', function () {
return 'Portada del foro';
});
// ...
// define los controladores globales
$app->get('/', function () {
return 'Portada del sitio';
});
$app->mount('/blog', $blog);
$app->mount('/forum', $forum);
Nota La opción $app['controllers_factory']
es una factoría que devuelve una instancia de la clase ControllerCollection
.
El método mount()
añade el prefijo indicado como argumento a todas las rutas antes de añadirlas a la aplicación. Así que en este ejemplo, la ruta /
apunta a la portada del sitio, la ruta /blog/
apunta a la portada del blog y la ruta /forum/
apunta a la portada del foro de discusión.
Advertencia Cuando se importa una colección de rutas bajo el prefijo /blog
, no se puede definir una nueva ruta para la URL /blog
. En otras palabras, /blog/
sería la URL más corta posible.
Nota Los métodos get()
, match()
y cualquier otro método HTTP ejecutado sobre la clase Application
se ejecutan realmente sobre una instancia por defecto de ControllerCollection
(almacenada en la variable $app['controllers']
).
Otra de las ventajas de agrupar los controladores de esta forma es que puedes aplicar opciones de configuración de forma global a varios controladores. Utilizando el mismo ejemplo que el del capítulo de los middlewares, esta es la forma en la que puedes aplicar la capa de seguridad a un conjunto de controladores relacionados con el backend de la aplicación:
$backend = $app['controllers_factory'];
// todos los controladores exigen que el usuario esté logueado
$backend->before($mustBeLogged);
Truco Si lo prefieres, puedes guardar cada colección de controladores en un archivo PHP diferente.
// archivo blog.php
$blog = $app['controllers_factory'];
$blog->get('/', function () { return 'Portada del blog'; });
return $blog;
// archivo app.php
$app->mount('/blog', include 'blog.php');
En lugar de incluir el archivo con la instrucción include
, también puedes crear un proveedor de controladores, tal y como se explicará más adelante.