Créer une application Zend Framework avec modules
2010
Introduction
Zend Framework permet de construire une application avec une structure modulaire.
En effectuant un Zend_Debug::dump($this->_request->getParams()); dans IndexController.php on obtiendra les informations suivantes :
array(3) {
["module"] => string(5) "default"
["controller"] => string(5) "index"
["action"] => string(5) "index"
}
Beaucoup d’applications en ligne se contenteront d’un module par défaut, nommé default, situé dans application/. Nul besoin de se soucier des modules dans ce cas de figure. Mais pour d’autres applications, notamment celles comprenant une interface d’administration, ou des actions en ligne de commande (éventuellement pilotées depuis un crontab) il y aura – a minima – deux modules : un pour la partie publique du site, un pour l’interface d’administration. Nous allons voir comment mettre en place une architecture modulaire simple, pour une partie publique (frontend) et une administration (backend).
Commençons par créer une application Zend Framework vide.
Création de l’application
Sous Windows, ouvrez une invite de commandes (cmd), rendez-vous dans le répertoire où vous souhaitez créer votre projet et tapez « C:\[chemin complet vers...]\zf.bat create project modularProject« , par exemple « C:\wamp\www\zf195\bin\zf.bat create project modularProject » si zf.bat se trouve dans C:\wamp\zf195\bin.
Pour les linuxiens, en mode console, rendez-vous dans le répertoire ou vous souhaitez créer votre projet, effectuez un « locate zf.sh » pour récupérer le chemin complet, puis tapez « /[chemin complet vers...]/zf.sh create project modularProject« . Voilà, vous avez un projet vide mais complet.
Ajout des modules
Nous allons commencer par nous rendre dans le dossier nouvellement créé, modularProject. Voici l’architecture du projet :

Dans application/, créons un nouveau répertoire, que nous nommerons modules, et deux sous-répertoires, default et admin.
Copions maintenant les dossiers application/controllers/, application/models/ et application/views/ dans le répertoire default, puis répétons cette opération pour le répertoire admin, avant de supprimer les 3 dossiers d’origine.
Puis ajoutons un fichier Bootstrap.php à la racine de chacun des deux nouveaux dossiers, qui étendra non plus Zend_Application_Bootstrap_Bootstrap mais Zend_Application_Module_Bootstrap, dans lequel nous mettrons une classe Bootstrap préfixée du nom du module, et vide pour le moment. Voici la nouvelle structure de notre application :

Modifications
Nous allons maintenant rentrer dans le répertoire application/default/controllers/, ouvrir le fichier IndexController.php et préfixer le nom de la classe avec le nom du module, en mettant la première lettre en majuscule et en le faisant suivre d’un underscore, comme suit : class Default_IndexController. Nous répèterons cette opération sur ErrorController.php : class Default_ErrorController puis sur les controllers du module admin.
Dans chaque controller, si nous souhaitons faire appel aux modèles du module, nous surchargerons la méthode init() :
public function init() {
parent::init();
$models = $this->_request->getParam('module').'/models';
set_include_path('../application/modules/'.$models . PATH_SEPARATOR . get_include_path());
}
Puis rendons-nous dans le fichier application/configs/application.ini
;remplacer ;resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" ;ajouter resources.modules[] = ""
puis dans le fichier application/Bootstrap.php où nous ajouterons la méthode _initAutoLoader
protected function _initAutoLoader() {
$autoloader = Zend_Loader_Autoloader::getInstance();
}
Si nous voulons charger les modèles sans utiliser de require, require_once, include ou include_once.
Votre application fonctionne, il ne vous reste plus qu’à optimiser le code ci-dessus, et à développer votre application.
6 comments
Trackback e pingback
No trackback or pingback available for this article

salut, je voudrais ajouter une remarque sur le tutoriel qui marche bien quand on s’arrete au niveau des controllers et views mais quand on inclut les models (les classes) il y a un probleme, le code dans init() de indexController ne marche pas. Je ne sais pas si c’est un probleme de version de zend car j ai travaillé avec la version 1.10.8. j ai finalement pu resoudre le probleme d’inclusion des classes de models en remplacant le code de la methode _initAutoLoader() du bootstrap du module par celui ci:
$autoloader = new Zend_Application_Module_Autoloader(array(
‘namespace’ => ‘Visiteur’, ‘basePath’ => APPLICATION_PATH . ‘/modules/visiteur’,));
return $autoloader;
donc ici le nom du module est visiteur et on pourra avoir la classe Visiteur_Model_classe.php
qui sera instancié au niveau du controller.
@Amadou
Oui, il est possible qu’il y ait eu des modifications au cœur de ZF, je n’ai utilisé ce code que sur du 1.10.1 et 1.10.2, donc comme le framework évolue au fil du temps… Ce qui fonctionnait aujourd’hui sera peut-être à revoir demain.
Bonjour et merci pour ce tuto clair tout frais !
J’essaie de mettre en place la structure modulaire comme vous la décrivez mais je n’ai pas compris comment accéder aux modules. Je n’ai pas « Application error » mais une page vide et sans code source.
Dans une structure non modulaire la racine de l’application est : /www/website/public/
Et si on a un controlleur IndexController.php dans lequel on a une fonction ajouterAction(), par exemple, l’url est du type /www/website/public/index/ajouter
Dans votre exemple, pouvez-vous me dire quelles sont les url des modules et de leurs action ?
Est-ce qu’il n’y aurait pas les routes à configurer ?
Finalement, j’ai réussi à mettre en place une structure multi-module en suivant ce tuto :
http://www.zfforums.com/zend-framework-general-discussions-1/resources-developers-37/setup-multi-modules-zend-framework-v1-9-13-steps-3737.html
@eric
Jusqu’à la v1.10.2, il n’y avait rien d’autre à configurer. Par contre, il est nécessaire de bien gérer le APPLICATION_PATH : si la racine est /www/website/public/ il n’est pas recommandé de mettre l’application dans le répertoire public/, il est préférable de mettre l’application dans un répertoire non accessible depuis le web, /www/website/application/ par exemple.
Je vais chercher dans mes archives pour que l’on puisse télécharger un exemple fonctionnel d’architecture modulaire depuis l’article.
@eric
Parfait ! Je vais moi aussi lire cet article, et certainement réviser le mien en suivant…