Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour!
Je tente d'utiliser l'architecture par modules avec Zend et jusque la ça allait, mais je rencontre un problème, alors tout d'abord j'aimerais savoir si ce que j'ai fais est bon !
Voici mon arborescence :
J'ai donc deux modules, default et admin, je peux accéder correctement aux deux modules.
Mon Bootstrap principal :
[lang=php]<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoLoader() { $autoloader = Zend_Loader_Autoloader::getInstance(); } }
Mon application.ini :
[production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.params.displayExceptions = 0 resources.modules[] = "" resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
Et mon IndexController qui pose problème :
[lang=php]class IndexController extends Zend_Controller_Action { public function init() { parent::init(); $models = $this->_request->getParam('module').'/models'; set_include_path('../application/modules/'.$models . PATH_SEPARATOR . get_include_path()); } public function indexAction() { //require('../application/modules/default/models/users.php'); $users = new Application_Model_DbTable_Users(); // Ici il ne trouve pas la classe //$this->view->users = $users->listeUsers(); } }
Le problème viens quand je veux instancier ma classe Application_Model_DbTable_Users, il ne la trouve pas, donc je me suis dis que c'est parce-qu'il ne trouvais pas le fichier, j'ai donc mis un require comme vous pouvez le voir en commentaire et la ça marche.
Mais pourtant dans l'init du controller le set_include_path devrait fonctionner non ? Si j'affiche get_include_path le chemin est bon !
Des idées ?
Merci d'avance !
Edit :
Je précise aussi que lorsque je met le require, ma classe est bien trouvé mais je me retrouve avec l'erreur :
Zend a écrit:
Message: No adapter found for Application_Model_DbTable_Users
Donc doit me manquer quelque-chose à paramétrer
Dernière modification par croftma (17-08-2011 13:16:12)
Hors ligne
Bonjour,
Pour chaque module, il faut créer un bootstrap de module. Ce sujet a déjà été traité sur ce site, et la réponse en mode développée en anglais se trouve sur le site de Rob Allen : Bootstrapping modules in ZF 1.8 and up.
Il faut donc que tu crées un fichier bootstrap.php dans chaque module, et que tu y mettes juste la déclaration de la classe de bootstrap de module.
Hors ligne
En fait je ne vois pas ton arborescence... Surement un coup de Websense, je suis au boulot et ici on a pas un accès complet au net, tout est filtré...
Application_Model_DbTable_Users doit se trouver dans /application/Models/DbTable/Users.php, si tu veux utiliser un model spécifique à ton module, remplace Application par le nom du module.
Si tu peux, essaye de faire un petit schéma de ton archi pour que je puisse le voir ici genre :
application
- models
- DbTable
Mets que ce qui est importants (models, modules et bootstraps)
Hors ligne
Ok donc voici mon archi :
Application
-- configs
-- layouts
-- modules
-- admin
-- default
-- controllers
-- models
-- DbTable
-- users.php
-- views
-- bootstrap.php
-- bootstrap.php
-- library
-- public
Mes fichiers mis à jour :
IndexController du module Default :
[lang=php] <?php class IndexController extends Zend_Controller_Action { public function init() { } public function indexAction() { //require('../application/modules/default/models/users.php'); $users = new Application_Model_DbTable_Users(); $this->view->users = $users->listeUsers(); } }
Le fichier users.php
[lang=php] <?php class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract { ... }
Le bootstrap du module default :
[lang=php] <?php class Default_Bootstrap extends Zend_Application_Module_Bootstrap { }
Hors ligne
En effet, le code de users.php est bon dans le cas où tu mets le fichier dans Application/models/DbTable/.
Si tu veux le charger dans ton module, il faut que tu l'appelles Default_Model_DbTable_Users
Hors ligne
Oui en effet il semblerait que tu n’aies pas défini d'adaptateur de vase de données...
Si tu utilises Zend_Tool, tu peux mettre la commande suivante avec tes paramètres :
zf configure db-adapter "adapter=PDO_PGSQL&host=localhost&dbname=mydb&username=admin&password=pass"
Hors ligne
Là, ça veux dire que tu n'as pas configurer ton adaptateur de base de données dans ton bootstrap...
As-tu une ligne qui ressemble à ça dans ton bootstrap ?
[lang=php] /* ... */ $db = Zend_Db::factory(/*tes options*/); Zend_Db_Table::setDefaultAdapter($db); /* ... */
Sinon, vu que tes 2 bootstraps sont vide, un seul serait largement suffisant...
Il te suffirait juste :
- soit de réunir tes modèles dans un seul répertoire et d'ajouter ce répertoire à l'autoloader
- soit d'ajouter tes 2 répertoires de modèles à l'autoloader
- soit d'ajouter le répertoire du module courant en testant la requête en cours.
Un truc dans cette idée :
[lang=php] class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { /* ... */ protected function _initAutoloader() { $resourceLoader = new Zend_Loader_Autoloader_Resource(array( 'basePath' => '/path/to/models/', 'namespace' => '', 'resourceTypes' => array( 'tables' => array( 'path' => 'DbTables/', 'namespace' => 'DbTable_') ))); } /* ... */ }
Et surtout, pas de "require" au milieu de ton code, sinon ça va devenir le gros bordel et vas-y pour passer au namespace après !
Hors ligne
Humpf mais quel boulet, je pensais avoir copier coller mon application.ini en fait non x)
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = user
resources.db.params.password = mdp
resources.db.params.dbname = bdd
Avec ça en plus ça marche mieux!
Et non non le require c'était juste pour les tests
Merci à vous !!!
Dernière modification par croftma (17-08-2011 13:21:49)
Hors ligne