Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour tout le monde,
Est ce que vous êtes pour une architecture modulaire du style:
/application
/default/
/controller/
/views/
/models/
/module1/
/controller/
/views/
/models/
Ou est ce que vous êtes pour une architecture classique
/application
/controller/
/views/
/models/
Quels sont les avantages de chacune architecture d'après vous? Dans quels types de projets vous préferiez l'une des architectures?
A vos claviers les Zendien
Cordialement
Dernière modification par verboz (28-06-2007 03:23:07)
Hors ligne
salu
Ca dépend de la taille de ton projet, s'il est un gro projet je ferai la modulaire, sinon la non modulaire
Dernière modification par mohamed (28-06-2007 05:13:50)
Hors ligne
c'est aussi possible de faire comme ça:
/application/
/modules/
/default/
/controllers/
/models/
/views/
/foo/
/controllers/
/models/
/views/
/bar/
/controllers/
/models/
/views/
aprés dans index.php, vous pouvez faire simplement:
$frontController->addModuleDirectory('/path/to/application/modules');
comme ça il n'y a pas de besoin de créer un array avec module noms et paths pour controllers pour chaque module.
aussi, meme si vous creer une structure sans modules, le Zend Framework va supposer une module avec le nom 'default'.
por verifier, dans un controller faire ça:
$request = $this->getRequest(); $module = $request->getModuleName();
plus de info sur Modules et Zend Framework:
http://framework.zend.com/manual/fr/zen … dular.html
Hors ligne
fizzbanana ->
Je suis en train d'essayer cette architecture, et ca ne marche pas pour moi, j'ai ce message d'erreur :
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Admin_IndexController")' in /home/gollum/web/www/library/Zend/Controller/Dispatcher/Standard.php:292 Stack trace: #0
Une idée du pourquoi ?
Merci
Hors ligne
Oui c'est normale,
Bon voilà, apparament tu as un module nomé Admin, donc tous tes controlleurs doivent porter le nom Module_IndexController et ainsi de suite.
Attention, le nom des controlleurs reste le meme cad IndexController, NomController....... mais le nom de la classe doit porter le nom du module avec.
J'espère que je me suis bien exprimé.
Cordialement
Hors ligne
Bien vu, bien vu oui c'est ca.
Oui toi tu as bien été clair, c'est la doc qui ne l'etait pas, enfin c'est peut etre moi qui ne l'est pas comrpris(doc anglais).
Un grand merci verboz
Il me plait de plus en plus ce framework
Hors ligne
Perso j'utilise ça:
/application/
/controllers/
/models/
/views/
/module1/
/controllers/
/models/
/views/
/module2/
/.../
Et dans le code tu fais simplement
$frontController->setControllerDirectory(array(
'default' => './application/controllers',
'page' => './application/page/controllers'
));
Et quand tu met http://www.monsite.com/controller/action/ sa appelle le controller par défaut et si tu spécifie un module sa va dans les dossiers de module.
C'est le mieux je trouve car tu as un module "default" qui gère les autre modules, c'est ton CORE.
Hors ligne
Oui je suis d'accord avec toi, la documentation n'est pas assez claire, plutot y'a pas bcp d'exemple et ça gène un peu mais bon, n'oublier pas que c'est un framework qui est encore à la version 1 et bcp de boite de développement ont peur de le déployer, donc y'a pas vaiment d'aide claire, tout le monde est entrain d'apprendre pour le moment c'est pour ça que tu trouveras bcp de façon de faire.
Bein autre aide que je peux te donner c'est: rejoint le channel IRC sur le serveur irc.freenode.net et entre dans le channel #zftalk, là tu pourras avoir l'aide nécéssaire.
Allez à+ et encore un grand merci à philippe et à tous les fondateurs de ce forum
Cordialement
Hors ligne
Allez hop, je profite de ce vieux topic
Bonjour à tous
Voila, je veux regarder un peu cette histoire de module et je souhaiterai pouvoir utiliser les vues par défaut à l'intérieur de mes vues de chaque module.
Je m'explique, dans mon view/script/ actuel, j'ai un dossier _include qui contient des fichiers tableaux.inc.tpl, formulaire.inc.tpl ... (le contenu de ses fichiers smarty, sont des modèles de présentations qui doivent être les meme dans tout mon dév, defaut comme module). Du coup j'hésite entre ca :
/application
/default
/models
/view
/controllers
/module1
/models
/view
/controllers
ou :
/application
/models
/view
/controllers
/module1
/models
/view
/controllers
C'est quoi le "plus mieux" propre et simple pour réutiliser des vues et des modèles aussi du coup car on peut avoir besoin de tables système un peu dans tous les modules
Geoffrey
Hors ligne
Je cherche aussi à mettre en place une telle structure pour une application existante.
Ancienne structure :
/applis/controllers/xxxController.php
/applis/models/nomModule/xxxModel.php
/applis/views/nomModule/xxx.php
/commun/Zend
...
Nouvelle structure désirée :
/applis/modules/default
/applis/modules/mod1
/applis/modules/mod2 ...
Je ne trouve pas vraiment d'article simple permettant de me faire une idée réelle de l'ampleur de la tâche que je dois accomplir.
La raison pour laquelle je voudrais changer de structures, c'est que quand je dois modifier/corriger un "module", je dois me farcir toute l'arborescence de l'applis pour retrouver tous mes petits. Par exemple, je veux ajouter une variables à afficher dans une vue, je dois d'abord modifier le controleur pour ajouter la nouvelle variable et ensuite rechercher la vue correspondante pour prendre en compte la modif.
Une précision : j'ai 64 controlleurs et autant de rep /applis/models et /applis/views
Hors ligne
Allez, après y avoir passé une grosse partie de l'après-midi, voici ma réflexion quand à la gestion modulaire d'une appli.
Je précise que j'utilise Smarty pour la couche V, je ne sais pas si ca change grand chose, mais en tout cas pour moi ca rajoute une petite prise de tête supplémentaire lol.
L'arborescence :
Au final, j'ai choisi çà :
/application
/default
/controllers
/models
/views
/module01
/controllers
/models
/views
/modules02
/controllers
/models
/views
/library
/public
/smarty
/cache
/plugins
/configs
/templates_c
Bon j'ai un peu détaillé, mais le dossier plugins de smarty est important.
Alors voilà mon idée :
Pour les modèles, dans le bootstrap, je fais un path sur le models de defaut uniquement
set_include_path('.' . PATH_SEPARATOR . '../application' . PATH_SEPARATOR . '../application/default/models/' . PATH_SEPARATOR . '../library' . PATH_SEPARATOR . get_include_path()
Après dans les modules, j'appelle mes classes modèles de la manière suivante :
Zend_Loader::loadClass('MaClasse', 'modules/module01/models');
ou s'il s'agit d'une classe commune qui est dans default/models
Zend_Loader::loadClass('MaClasse');
Pour les vues, elles sont définies dans chaques modules et pour mes morceaux de script commun, je cré tout simplement des plugins Smarty, ainsi j'ai un plugin header, un footer, un tableau, un formulaire, ...
Voilà, qu'en pensez-vous, et surtout existe quelque chose en natif, qui me permet d'éviter de mettre en place tout ceci ?
Geoffrey
Hors ligne
Donc, grossomodo, ta réflexion ressemble extremement à ça :
http://framework.zend.com/manual/fr/zen … dular.html
(hormis smarty)
Hors ligne
Phoenix17 a écrit:
Donc, grossomodo, ta réflexion ressemble extremement à ça :
http://framework.zend.com/manual/fr/zen … dular.html
(hormis smarty)
Oui bien sûr, mais la doc est extrêmement flou. On se retrouve avec un tas de module indépendant, moi ce qui me posait problème, c'est comment utiliser des vues et de modèles communs, la doc de zend ne dit rien la-dessus (ou je ne l'ai pas trouvé). J'ai l'impression que les modules sont quasiment gérés comme des mini-sites.
Geoffrey
Hors ligne
Salut
j'utilise ça
/application /default /controllers /models /views /module01 /controllers /models /views /modules02 /controllers /models /views /generic /module1 /controllers /models /views /module2 /controllers /models /views /module3 /controllers /models /views /library /public
je place mes module applicatif dans l'application.
mais les module purement générique (ceux que j'utilise dans toutes ou presque mes appli) je les place dans un dossier au même niveau que application
ces modules sont gérés dans des projets séparé de l'application, c'est le cas par exemple de login qui est un module qui prends en charge la phase de login
mais aussi de usermanager qui permet de gérer les utilisateur groupe de travail role et profiil
je ne mets comme module dans mon application que ceux qui sont propre à l'application
si avec le temps il deviennent réutilisables et généralisable il feront l'objet d'un projet de généralisation et migreront dans le dossier générique
cela permet une répartition du travail en équipe plus facile.
j'utilise un fichier de configuration qui liste les module générique à utiliser et ajoute seul les éléments nécessaire au boutstrap
je peux donc packager un sur ensemble de ZF contenabt ZF les lib maison et les modules générique qui sert de point de départ pour le développement d'une application.
il l'application nécessite un login il suffit de le dire dans le fichier de configuration. de même si l'application gère elle même ses utilisateurs. etc.
A+jyt
Hors ligne
Très intéressant, je vais me pencher dessus pour voir comment adapter une telle structure à mon projet
En fait, dans generic, tu te fais un "sous-framework" en quelque sorte ...
Merci
Hors ligne
oui dans généric je mets des module entièrement réutilisable d'une application sur l'autre.
login usermanager
exporter
chaque module se comporte comme une mini application embarquée.
avec du paramétrage
A+JYT
Hors ligne
Bonjour,
Désollé de remonter ce vieux sujet mais c'est celui qui semble le mieux correspondre à mon problème.
Je dev en PHP depuis quelques années (J'ai ma certif Zend et tout et tout) et j'ai décidé de mettre au ZF après avoir été grand utilisateur du Framework-fait-maison-dans-le-garage.
Je l'utilise depuis 2 mois en version 1.7.0 et 1.9.6, j'ai du lire 3 fois la doc Zend, 1 fois Bien développer en PHP de Julien Pauli et Guillaume Ponçon (J'espère qu'ils ont pu acheter une bièrre avec les euros liés à cet achat), et x pages de Faq, tutoriels, codes libres.
Je voudrais faire un projet d'une grande modularité et est donc décidé de customisé ZF de la manière suivante :
/application /models (Accessible dans toute l'appli) /modules /modules01 /modules02 barController.php fooController.php /configs /layout /bar monAction.phtml monAction.json.phtml monAction2.phtml monAction2.json.phtml /foo monAction.phtml monAction.json.phtml monAction2.phtml monAction2.json.phtml /modules03 /modules04 /library /MaLib qui étends Zend_Controller_Action , Zend_Form, des Helpers ... /Zend /public
Je remercie toute personne qui m'aiderait car 15h que j'essaye de faire marcher une telle architecture et je n'arrive à... rien... (vraiment rien).
L'idée du projet est que moi même aussi bien que n'importe qui puisse rajouter un module, son/ses controlleurs, sa config, ses vues, ses layouts. Par une mises dans le dossier /application/modules/ et l'activé depuis une interface graphique proposée dans un panneau d'administration qui faire partie du 'core' de l'application.
Le framework ainsi "implémenté" se charge de fournir via MaLib_Controller_Action, des interfaces pour inclure les modèles, modifier les layouts, rendre une réponse html ou jsont.
Un système utilisant les plugin et Zend_ACL se charge de vérifier qu'un module est activé et que l'utilisateur à les droits d'y acceder.
Mon premier problème c'est d'atteindre mon module quand je tape l'url.
require_once 'Zend/Controller/Front.php'; $front = Zend_Controller_Front::getInstance(); $front->setModuleControllerDirectoryName(''); $front->addModuleDirectory(APPLICATION_PATH.'/modules');
Si je tape dans mon url http://monsite.tld/
Je devrais interoger : /application/modules/default/IndexController.php
Mais j'ai une page blanche
[02-Jan-2010 12:29:26] PHP Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in /var/www/intraweb/library/Zend/Controller/Dispatcher/Standard.php:242
Stack trace:
#0 /var/www/intraweb/library/Zend/Controller/Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /var/www/intraweb/library/Zend/Application/Bootstrap/Bootstrap.php(77): Zend_Controller_Front->dispatch()
#2 /var/www/intraweb/library/Zend/Application.php(358): Zend_Application_Bootstrap_Bootstrap->run()
#3 /var/www/intraweb/public/index.php(36): Zend_Application->run()
#4 {main}
thrown in /var/www/intraweb/library/Zend/Controller/Dispatcher/Standard.php on line 242
Any idea ?
Je vous remercie par avance, je présenterais mon projet quand il sera plus avancé plus tard
Je commence à trainner sur #zftalk-fr soir & week-end
Edit: J'avais lu une histoire de bootstrap par module, est ce nécéssaire ?
Dernière modification par Ph (02-01-2010 12:49:58)
Hors ligne
Bon j'ai ma solution , en fait dans le fichier de config livré avec zf (dans le ZfQuickStart ou avec le zf.sh ) on a une ligne de commande à commenter :
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
C'était con ! Mais bon c'était à savoir ! Enfin c'est pas là où j'ai perdu mes heures, j'ai surtout perdu mes heures pour les lignes de codes suivantes qui n'ont pas trouvées leur réponse :
<?php /** * @see Zend_Controller_Action */ require_once 'Zend/Controller/Action.php'; abstract class Malib_Controller_Action extends Zend_Controller_Action{ public function init(){ parent::init(); // On ne sait jamais pour le futur... /*[...]*/ $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($this->view); $viewRenderer->setViewBasePathSpec(':moduleDir/:module/:controller/'); Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); } /*[...]*/ } ?>
Ces lignes sont font donc parti de ma librairie, elles servent à modifier le répertoire de vue...
Mais c'est un echec total
Message: script 'index/index.phtml' not found in path (/var/www/intraweb/application/modules/views/scripts/)
Stack trace:
#0 /var/www/intraweb/library/Zend/View/Abstract.php(827): Zend_View_Abstract->_script('index/index.pht...')
#1 /var/www/intraweb/library/Zend/Controller/Action/Helper/ViewRenderer.php(903): Zend_View_Abstract->render('index/index.pht...')
#2 /var/www/intraweb/library/Zend/Controller/Action/Helper/ViewRenderer.php(924): Zend_Controller_Action_Helper_ViewRenderer->renderScript('index/index.pht...', NULL)
#3 /var/www/intraweb/library/Zend/Controller/Action/Helper/ViewRenderer.php(963): Zend_Controller_Action_Helper_ViewRenderer->render()
#4 /var/www/intraweb/library/Zend/Controller/Action/HelperBroker.php(277): Zend_Controller_Action_Helper_ViewRenderer->postDispatch()
#5 /var/www/intraweb/library/Zend/Controller/Action.php(523): Zend_Controller_Action_HelperBroker->notifyPostDispatch()
#6 /var/www/intraweb/library/Zend/Controller/Dispatcher/Standard.php(289): Zend_Controller_Action->dispatch('indexAction')
#7 /var/www/intraweb/library/Zend/Controller/Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#8 /var/www/intraweb/library/Zend/Application/Bootstrap/Bootstrap.php(77): Zend_Controller_Front->dispatch()
#9 /var/www/intraweb/library/Zend/Application.php(358): Zend_Application_Bootstrap_Bootstrap->run()
#10 /var/www/intraweb/public/index.php(37): Zend_Application->run()
#11 {main}
J'espère que mon post aura aider d'autres architectes .
Dernière modification par Ph (02-01-2010 16:34:52)
Hors ligne