Ver índice de contenidos del libro

Capítulo 4. Organizando los controladores

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.