TigerZF
🌐Español

24.11. Uso de una estructura de directorios modular convencional

24.11.1. Introducción

La estructura de directorios modular convencional le permite separar diferentes aplicaciones MVC en unidades autocontenidas, y reutilizarlas con diferentes controladores frontales. Para ilustrar tal estructura de directorios:

docroot/
    index.php
application/
    default/
        controllers/
            IndexController.php
            FooController.php
        models/
        views/
            scripts/
                index/
                foo/
            helpers/
            filters/
    blog/
        controllers/
            IndexController.php
        models/
        views/
            scripts/
                index/
            helpers/
            filters/
    news/
        controllers/
            IndexController.php
            ListController.php
        models/
        views/
            scripts/
                index/
                list/
            helpers/
            filters/

En este paradigma, el nombre del módulo sirve como prefijo para los controladores que contiene. El ejemplo anterior contiene tres controladores de módulo, 'Blog_IndexController', 'News_IndexController', y 'News_ListController'. También se definen dos controladores globales, 'IndexController' y 'FooController'; ninguno de ellos llevará espacio de nombres. Esta estructura de directorios se usará para los ejemplos de este capítulo.

[Note] Sin espacio de nombres en el módulo por defecto

Tenga en cuenta que en el módulo por defecto, los controladores no necesitan un prefijo de espacio de nombres. Así, en el ejemplo anterior, los controladores del módulo por defecto no necesitan un prefijo 'Default_' -- simplemente se despachan según su nombre de controlador base: 'IndexController' y 'FooController'. Sin embargo, en todos los demás módulos se usa un prefijo de espacio de nombres.

Entonces, ¿cómo se implementa una estructura de directorios así usando los componentes MVC de Zend Framework?

24.11.2. Especificar directorios de controladores de módulo

El primer paso para hacer uso de módulos es modificar la forma en que se especifica la lista de directorios de controladores en el controlador frontal. En la serie básica MVC, se pasa un array o una cadena a setControllerDirectory(), o una ruta a addControllerDirectory(). Al usar módulos, es necesario modificar ligeramente las llamadas a estos métodos.

Con setControllerDirectory(), deberá pasar un array asociativo y especificar pares clave-valor de nombre de módulo y rutas de directorio. La clave especial default se usará para los controladores globales (aquellos que no necesitan espacio de nombres de módulo). Todas las entradas deben contener una clave de tipo cadena que apunte a una única ruta, y la clave default debe estar presente. Por ejemplo:

$front->setControllerDirectory(array(
    'default' => '/path/to/application/controllers',
    'blog'    => '/path/to/application/blog/controllers'
));

addControllerDirectory() aceptará un segundo argumento opcional. Al usar módulos, pase el nombre del módulo como segundo argumento; si no se especifica, la ruta se añadirá al espacio de nombres default. Por ejemplo:

$front->addControllerDirectory('/path/to/application/news/controllers',
                               'news');

Dejando lo mejor para el final, la forma más sencilla de especificar los directorios de módulo es hacerlo en bloque, con todos los módulos bajo un directorio común y compartiendo la misma estructura. Esto se puede hacer con addModuleDirectory():

/**
 * Assuming the following directory structure:
 * application/
 *     modules/
 *         default/
 *             controllers/
 *         foo/
 *             controllers/
 *         bar/
 *             controllers/
 */
$front->addModuleDirectory('/path/to/application/modules');

El ejemplo anterior definirá los módulos default, foo, y bar, cada uno apuntando al subdirectorio controllers/ de su respectivo módulo.

Puede personalizar el subdirectorio de controladores a usar dentro de sus módulos usando setModuleControllerDirectoryName():

/**
 * Change the controllers subdirectory to be 'con'
 * application/
 *     modules/
 *         default/
 *             con/
 *         foo/
 *             con/
 *         bar/
 *             con/
 */
$front->setModuleControllerDirectoryName('con');
$front->addModuleDirectory('/path/to/application/modules');
[Note] Nota

Puede indicar que no se use ningún subdirectorio de controladores para sus módulos pasando un valor vacío a setModuleControllerDirectoryName().

24.11.3. Enrutando a módulos

La ruta por defecto en Zend_Controller_Router_Rewrite es un objeto de tipo Zend_Controller_Router_Route_Module. Esta ruta espera uno de los siguientes esquemas de enrutamiento:

  • :module/:controller/:action/*

  • :controller/:action/*

En otras palabras, coincidirá con un controlador y una acción por sí solos o precedidos por un módulo. Las reglas de coincidencia especifican que un módulo solo se hará coincidir si existe una clave con el mismo nombre en el array de directorios de controladores pasado al controlador frontal y al despachador.

24.11.4. Controlador por defecto de módulo o global

En el enrutador por defecto, si no se especificó un controlador en la URL, se usa un controlador por defecto (IndexController, a menos que se solicite otro). Con controladores modulares, si se ha especificado un módulo pero no un controlador, el despachador primero busca este controlador por defecto en la ruta del módulo, y luego recurre al controlador por defecto que se encuentra en el espacio de nombres global 'default'.

Si desea recurrir siempre al espacio de nombres global, establezca el parámetro $useDefaultControllerAlways en el controlador frontal:

$front->setParam('useDefaultControllerAlways', true);