Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai un soucis avec mon projet ZF. Je cherche à ajouter les modèles sur mon projet (qui sert juste de projet d'apprentissage).
Le soucis c'est que ZF n'arrive pas à le trouver. J'ai le droit à un beau message d'erreur lorsque j'essaye d'instancier mon modèle comme quoi il n'a pas trouvé la classe.
J'essaye d'instancier TCompagnie dans PieceController via :
[lang=php]public function allCompagnies(){ $table_compagnie = new TCompagnie(); return $table_compagnie->fetchAll(); }
Mon modèle TCompagnie :
[lang=php]<?php class Models_TCompagnie extends Zend_Db_Table_Abstract{ protected $_name="compagnie"; protected $_primary="id"; } ?>
Message d'erreur :
Fatal error: Class 'TPiece' not found in /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php on line 125 Call Stack: 0.0002 340300 1. {main}() /home/shimrra/Bureau/workspace/festival/public/index.php:0 0.0490 4060748 2. Zend_Application->run() /home/shimrra/Bureau/workspace/festival/public/index.php:21 0.0490 4060748 3. Bootstrap->run() /home/shimrra/Bureau/workspace/festival/library/Zend/Application.php:366 0.0491 4060860 4. Zend_Application_Bootstrap_Bootstrap->run() /home/shimrra/Bureau/workspace/festival/application/Bootstrap.php:5 0.0492 4061096 5. Zend_Controller_Front->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Application/Bootstrap/Bootstrap.php:97 0.0621 5081016 6. Zend_Controller_Dispatcher_Standard->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Front.php:954 0.0681 5447640 7. Zend_Controller_Action->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Dispatcher/Standard.php:308 0.0682 5453668 8. PieceController->modifierAction() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Action.php:516 0.0714 5455252 9. PieceController->allCompagnies() /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php:38
Si je fais un include du fichier l'instanciation fonctionne. Je ne comprends pas pourquoi l'autoload ne se fait pas alors que dans le cas du tuto que je suis cela se réalise sans aucun ajout particulier.
Arborescence de mon projet :
festival/
application/
config/
application.ini
controllers/
CompagnieController.php
ErrorController.php
IndexController.php
MenuController.php
PieceController.php
layouts/
error.phtml
footer.phtml
layout.phtml
models/
TCompagnie.php
TPiece.php
views/Des dossiers par vues
Bootstrap.php
library/
public/
index.php
Edit:
j'ai ajouté : set_include_path(APPLICATION_PATH. '/models' . PATH_SEPARATOR . get_include_path()); dans mon index.php (dans le dossier public) mais sans aucun changement, il n'arrive toujours pas à charger ma classe.
Merci d'avance.
Shimrra
Dernière modification par Shimrra (09-10-2012 13:21:08)
Hors ligne
bonjour,
si la classe TCompagnie n'est jamais chargée c'est parce qu’elle ne respecte pas les conventions de nommage de ZF .l'espace de nom représentant application/models/TCompagnie.php sera :
[lang=php] //application/models/TCompagnie.php <?php class Application_Model_TCompagnie extends Zend_Db_Table_Abstract{ protected $_name="compagnie"; protected $_primary="id"; } ?>
Dernière modification par amiss (05-10-2012 12:35:54)
Hors ligne
Je viens d'essayer (j'avais déjà essayé), mais aucune différence toujours l'erreur :
Fatal error: Class 'Application_Model_TCompagnie' not found in /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php on line 126 Call Stack: 0.0032 339948 1. {main}() /home/shimrra/Bureau/workspace/festival/public/index.php:0 0.1129 4060528 2. Zend_Application->run() /home/shimrra/Bureau/workspace/festival/public/index.php:21 0.1129 4060528 3. Bootstrap->run() /home/shimrra/Bureau/workspace/festival/library/Zend/Application.php:366 0.1130 4060640 4. Zend_Application_Bootstrap_Bootstrap->run() /home/shimrra/Bureau/workspace/festival/application/Bootstrap.php:5 0.1131 4060876 5. Zend_Controller_Front->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Application/Bootstrap/Bootstrap.php:97 0.1332 5080744 6. Zend_Controller_Dispatcher_Standard->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Front.php:954 0.1437 5446932 7. Zend_Controller_Action->dispatch() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Dispatcher/Standard.php:308 0.1438 5452960 8. PieceController->modifierAction() /home/shimrra/Bureau/workspace/festival/library/Zend/Controller/Action.php:516 0.1439 5453344 9. PieceController->allCompagnies() /home/shimrra/Bureau/workspace/festival/application/controllers/PieceController.php:78
Mon prof qui nous a fait des vidéos de cours sur ZF dit dans sa vidéo qu'il n'y a pas de nommage particulier pour les models. Suffit de mettre un nom et de l'instancier mais perso ça fonctionne pas.
J'ai essayé d'utiliser Zend_Loader_Autoloader_Resource pour rajouter un dossier où aller chercher la classe mais rien n'y fait
Dernière modification par Shimrra (05-10-2012 13:28:01)
Hors ligne
on aimerait voir tes fichiers bootstrap, application.ini et public/index.php
Hors ligne
Mon bootstrap :
[lang=php] <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function run(){ Zend_Registry::set('showmenu', false); parent::run(); } /** * Charge un nouvel namespace pour une nouvelle library * @return: void **/ protected function _initLibraryFestival(){ $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->registerNamespace('Festival_'); } protected function _initSession(){ $session = new Zend_Session_Namespace('festival', true); return $session; } protected function _initConfig(){ $zf_config= new Zend_Config($this->getOptions(), true); Zend_Registry::set('config', $zf_config); } public function _initErrorHandler(){ $errorHandler = new Zend_Controller_Plugin_ErrorHandler(); $errorHandler->setErrorHandler(array('controller'=>'error', 'action'=>'index')); $this->bootstrap('frontController')->frontcontroller->registerPlugin($errorHandler); } public function _initDb(){ $database = Zend_Db::factory(Zend_Registry::get('config')->database); $database->query('SET NAMES UTF8'); Zend_Db_Table_Abstract::setDefaultAdapter($database); Zend_Registry::set('db', $database); } }
Mon application.ini :
[production] includePaths.library = LIBRARY_PATH bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" // configurer la ressource controller resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.defaultControllerName = "index" resources.frontController.defaultAction = "index" // configurer la ressource layout resources.layout.layoutPath = APPLICATION_PATH "/layouts" //erreurs php phpSettings.display_errors = 0 phpSettings.display_startup_errors = 0 //config base de données sql database.adapter = pdo_mysql database.params.host = localhost database.params.dbname = ZF_test database.params.username = root database.params.password = mysql [development : production] //erreurs php phpSettings.display_errors = 1 phpSettings.display_startup_errors = 1
mon index.php :
[lang=php] <?php defined ('APPLICATION_PATH') || define('APPLICATION_PATH',realpath(dirname(__FILE__) . '/../application')); defined ('LIBRARY_PATH') || define('LIBRARY_PATH',realpath(dirname(__FILE__) . '/../library')); defined ('APPLICATION_ENV') || define('APPLICATION_ENV',(getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development')); //on modifie le path de php set_include_path(implode(PATH_SEPARATOR, array(realpath(LIBRARY_PATH), get_include_path()))); //on a besoin de zen app pour lancer l'application require_once('Zend/Application.php'); //on lance la session require_once('Zend/Session.php'); Zend_Session::start(); //on créer l'application, on lance le bootstrap et l'application $application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/application.ini'); $application->bootstrap()->run();
Hors ligne
J'ai résolu le soucis. Mon problème venait d'un manque dans le fichier application.ini. J'ai ajouté :
appnamespace = "Application"
Il doit surement y avoir un nom par défaut qui n'est pas Application. Par contre ce que je ne comprends pas, c'est que mon prof nous dit dans la vidéo qu'on a aucune règle a respecter lors de la création des models
Hors ligne
j'avoue ne pas avoir le loisir d'écrire à la la main le fichier de configuration application.ini car j'ai toujours utilisé zend tools(en ligne de commande ou avec netbeans ) qui génère la structure de base d'un projet zend.
Par ailleurs il est inutile de rédefinir la méthode _initDb de Boostrap car tu l'a déjà fait dans le fichier de config(application.ini).
Le namesapce "Application" est attribué de manière arbitraire tu peux donner n'importe quel nom.Par contre le nommage des modèles, controllers... doivent respecter les conventions de nommage de zend(cf. la doc de ZF) auquel cas tes classes modèles ne seront jamais chargées.
Hors ligne
Ok, c'est bien ce qui me semblait après avoir cherché sur le net. Il faudra que je contactes la personne ayant fait le tutoriel pour lui indiquer son erreur.
Merci pour l'aide. Je passe le sujet en résolu.
Par contre je ne comprends pas ta réponse au sujet de mon _initDb. J'instancie une connexion à la base de données pour la réutiliser plus tard. Le fais de fournir en arguments dans application.ini les données de connexions suffit à lancer une connexion ?
Dernière modification par Shimrra (09-10-2012 13:24:14)
Hors ligne
la redéfinition de _initDB() était pratiquée pour les anciennes versions de zf (<1.8) mais avec les versions récentes plus besoin de créer(avec à la méthode factory) un objet de connexion à la BD car tout est déjà fait dans le fichier de configuration.
dans application.ini il suffit juste de respecter la syntaxe comme ceci:
; connexion à la bd resources.db.adapter = PDO_MYSQL resources.db.params.host = localhost resources.db.params.username = root resources.db.params.password = mysql resources.db.params.dbname = Zf_test resources.db.params.charset = "utf8"
Hors ligne
Et tu accèdes comment à la variable contenant l'objet de connexion du coup ? via une méthode ?
Hors ligne
l'objet de connexion $db t'en auras pas besoin .Il y a un bon tuto de robe allen sur developpez.com qui répond bien à ta préoccupation:
débuter avec ZF 1.10
Dernière modification par amiss (10-10-2012 12:30:09)
Hors ligne
Merci pour le lien, je l'avais parcourus pour mon soucis avec les models justement ^^. Si j'ai bien compris, vu qu'on passe par des modèles en héritant de Zend_Db_Table_Abstract, on a pas à gérer la connexion, vu qu'on passe par une syntaxe/méthodes de zend, c'est zend qui gère tout ça ?
Hors ligne
oui on a pas besoin de gérer la connexion avec la BD.En effet lors de l’instanciation du modèle (classe fille de Zend_Db_Table_Abstract), une connexion avec la BD est créée entraînant de fait le mapping entre le modèle et sa table correspondante.En plus pour effectuer des requêtes à la bd depuis le modèle on procède par la variable this.Ex: $this->fetch(...),$this->insert(...)...
Dernière modification par amiss (12-10-2012 17:22:17)
Hors ligne
okey. merci beaucoup pour toutes ces infos.
Hors ligne
Pages: 1