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.
![]() |
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:
' |
Entonces, ¿cómo se implementa una estructura de directorios así usando los componentes MVC de Zend Framework?
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');
![]() |
Nota |
|---|---|
Puede indicar que no se use ningún subdirectorio de controladores para sus
módulos pasando un valor vacío a
|
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.
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);
![[Note]](images/note.png)