Utilisation de conventions de dossiers modulaires
Introduction
Les conventions de dossiers vous permettent de séparer les différentes
applications MVC dans des unités isolées et les réutiliser dans le contrôleur frontal.
Voici une illustration :
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/
helpers/
filters/
Ci dessus, le nom du module est utilisé comme préfixe pour les contrôleurs qu'il
possède. Il y a donc trois contrôleurs : "Blog_IndexController",
"News_IndexController", et "News_ListController". Deux contrôleurs dans le module par
défaut sont aussi définis, "IndexController" et "FooController". Ceux-ci ne possèdent
pas le nom du module dans leur nom. Cet exemple d'arborescence conseillée sera utilisé
dans ce chapitre.
Note: Pas de namespace pour le module par défaut
Notez que dans le module par défaut, les contrôleurs n'ont pas besoin d'être
préfixés par le nom du module ("Default_"). Ils sont simplement distribués tels
quels. Ce n'est pas le cas pour les autres contrôleurs.
Alors, comment utiliser une structure telle que celle-ci ?
Spécification des dossiers de modules
La première chose à faire est d'indiquer au contrôleur frontal où se trouvent les
dossiers contenant les contrôleurs d'action. Passez un array
ou une
string
à setControllerDirectory(), ou alors une
string
à addControllerDirectory(). Si vous utilisez les
modules, ces appels de méthodes changent quelque peu.
Pour setControllerDirectory(), un tableau est requis. Les paires
clé/valeur représentent le nom du module, et le chemin des contrôleurs. La clé
default
est utilisée pour indiquer les contrôleurs globaux (dont le nom ne
comporte pas le module). Chaque option doit comporter une indication vers un chemin, et
la clé default
doit être présente :
$front->
setControllerDirectory(array(
'default' => '/path/to/application/controllers',
'blog' => '/path/to/application/blog/controllers'
));
addControllerDirectory() prend en paramètre une string
décrivant un chemin vers des contrôleurs. Si vous voulez indiquer un module, passez le
en second paramètre. Sinon, le chemin sera ajouté au module
default.
$front->addControllerDirectory('/path/to/application/news/controllers',
'news');
Enfin, si vous avez un dossier spécial regroupant tous vos modules, indiquez le
grâce à addModuleDirectory() :
/**
* Sur cet exemple :
* application/
* modules/
* default/
* controllers/
* foo/
* controllers/
* bar/
* controllers/
*/
$front->addModuleDirectory('/path/to/application/modules');
Dans le code ci dessus, vous déclarez 3 modules en une méthodes. Celle-ci
s'attend à la structure comprenant les modules default
, foo
,
et bar
, chacun devant posséder un dossier controllers
Si le dossier "controllers" ne vous convient pas, changez son nom à l'aide de
setModuleControllerDirectoryName() :
/**
* Le dossier des contrôleurs s'appelle désormais 'con'
* application/
* modules/
* default/
* con/
* foo/
* con/
* bar/
* con/
*/
$front->setModuleControllerDirectoryName('con');
$front->addModuleDirectory('/path/to/application/modules');
Note:
Si vos dossiers de modules ne doivent pas utiliser de sous dossier pour les
contrôleurs, alors passez une valeur vide à
setModuleControllerDirectoryName().
Routage des modules
La route par défaut, Zend_Controller_Router_Rewrite est un
objet de type Zend_Controller_Router_Route_Module. Cette route
traite les schémas de routage suivants :
Ainsi, elle va trouver les contrôleurs et actions, avec ou sans module les
précédant. Un module ne sera trouvé que si sa clé existe dans le tableau d'options
passé au contrôleur frontal ou au distributeur.
Module ou contrôleur Default global
Dans le routeur par défaut, si aucun contrôleur n'est indiqué dans l'URL, un
contrôleur par défaut sera utilisé (IndexController
, sauf si l'on décide
de changer ce paramètre). Avec des modules indiqués dans l'URL, si aucun contrôleur
n'est indiqué, alors le distributeur cherchera dans le module demandé le contrôleur par
défaut. Si celui-ci est absent, c'est celui du module "default" qui sera
utilisé.
Si vous voulez renvoyer directement vers le contrôleur par défaut du module
"default", passez le paramètre useDefaultControllerAlways
à
TRUE dans le contrôleur frontal :
$front->setParam('useDefaultControllerAlways', true);