Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1 2
Bonjour,
Je galère un peu avec les routes...
Voici mon arborescence
application
modules
default
controllers
IndexController.php
views
scripts
index
index.phtml
admin
controllers
IndexController.php
views
scripts
index
index.phtml
bootstrap.php // Admin_Bootstrap
bootstrap.php
Dans mon application.ini j'ai :
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultModule = "default"
resources.frontController.defaultAction = "index"
resources.frontController.defaultController = "index"
Dans mon bootstrap, j'ai tenté un :
protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('admin', new Zend_Controller_Router_Route_Static('admin', array(
'module' => 'admin',
'controller' => 'index',
'action' =>'index'))
);
return $router;
}
J'ai également tenté de modifier le fichier application.ini
resources.router.routes.admin.defaults.modules = "admin"
resources.router.routes.admin.defaults.controller = "index"
resources.router.routes.admin.defaults.action = "index"
Ma route par défaut semble fonctionner correctement mais pas la partie admin.
Hors ligne
Salut,
Normalement si tu fais bien un bootstrap de ta ressource "router" ou un bootstrap() (=toutes les ressources), la syntaxe suivante dans application.ini devrait suffire:
resources.router.routes.admin.type = "Zend_Controller_Router_Route_Static" resources.router.routes.admin.route = "admin" resources.router.routes.admin.defaults.module = "admin" resources.router.routes.admin.defaults.controller = "index" resources.router.routes.admin.defaults.action = "index"
Pas besoin de redéfinir _initRoutes() dans le bootstrap, c'est Zend_Application_Resource_Router qui sera utilisé.
Attention dans le code que tu as collé il y a un "s" à module:
resources.router.routes.admin.defaults.modules = "admin"
A+ benjamin.
Hors ligne
Merci pour ta réponse. J'ai apporté la correction au fichier application.ini et j'ai nettoyé le bootstrap.
Lorsque je fais http://dev.localhost/admin
J'obtiens :
An error occurred
Page not found
Exception information:
Message: Invalid controller class ("Admin_IndexController")
(...)
Request Parameters:
array(3) {
["module"]=>
string(5) "admin"
["controller"]=>
string(5) "index"
["action"]=>
string(5) "index"
Les paramètres ont l'air bon pourtant
Hors ligne
Bonjour,
Vérifie le nommage de tes fichiers quelques fois on zappe une majuscule.
Cordialement
Hors ligne
Pourquoi est-ce que tu utilises une route ?
Si tu déclares bien tes modules tu ne devrais pas avoir besoin de faire ça.
;====== Resource frontController resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.moduleControllerDirectoryName = "controllers" ;resources.frontController.defaultModule = ;====== Resource modules resources.modules[] = ""
Avec une url du type http://dev.localhost/admin/ il devrait se démmerder tout seul.
Hors ligne
C'est ce que j'espérais au départ, mais j'ai exactement le même problème. Du coup je me suis dis que j'avais peut être besoin d'une route spécifique mais apparemment non...
ashgenesis > C'est vrai qu'on est jamais à l'abri d'une petite erreur, surtout moi. J'ai revérifié et je ne vois pas d'erreurs dans mes noms.
Hors ligne
Avec le code que je t'ai donné dans application.ini ça devrait fonctionner.
Es-tu certains de tes chemins ? Les bootstrap dans tes dossiers de modules sont-ils correctes ?
Ex. pour admin tu dois avoir un bootstrap.php (à la racine du dossier du module) contenant au minimum:
<?php /** * Module admin - Bootstrap */ class Admin_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array( 'namespace' => 'Admin_', 'basePath' => dirname(__FILE__) )); return $autoloader; } }
A+
Dernière modification par Delprog (27-07-2009 15:45:16)
Hors ligne
Je vois que tu as fais ça dans une classe à part.
Cela ne suffit pas :
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Admin_',
'basePath' => APPLICATION_PATH
));
return $autoloader;
}
protected function _initView()
(...)
Hors ligne
Dans mes bootstrap je n'ai que l'initialisation de mes autoloader.
Dans le bootstrap de l'application j'ai l'initialisation pour le namespace par défaut. Ensuite dans chaque dossier de modules j'ai un bootstrap pour le module avec le namespace du module en question.
Ex :
Application:
<?php /** * Bootstrap de l'application * * @author Benjamin Dulau */ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array( 'namespace' => 'App_', 'basePath' => dirname(__FILE__), )); return $autoloader; } }
Module Admin:
<?php /** * Module admin - Bootstrap */ class Admin_Bootstrap extends Zend_Application_Module_Bootstrap { protected function _initAutoload() { $autoloader = new Zend_Application_Module_Autoloader(array( 'namespace' => 'Admin_', 'basePath' => dirname(__FILE__) )); return $autoloader; } }
En soulignant bien que pour le module admin le nom de la classe bootstrap et "Admin_Bootstrap".
Je crois que la doc précise qu'il faut un fichier de bootstrap pour chaque module.
A+
Hors ligne
le Stack trace:
Zend_Controller_Dispatcher_Standard->loadClass('IndexController')
Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
Zend_Controller_Front->dispatch()
Zend_Application_Bootstrap_Bootstrap->run()
Zend_Application->run()
Hors ligne
Delprog a écrit:
Dans mes bootstrap je n'ai que l'initialisation de mes autoloader.
(...)
Je crois que la doc précise qu'il faut un fichier de bootstrap pour chaque module.
A+
Je n'avais pas lu ça, pardonnez moi.
J'ai donc créé mon second bootstrap. Question : comment lier tous ces bootstraps entre eux, il va bien falloir qu'à un moment donné j'instancie l'Admin_Bootstrap?
Hors ligne
Non c'est automatique.
Tu indiques l'emplacement de tes modules dans application.ini et Zend_Application se démerde. Il s'attend à trouver un fichier de bootstrap dans chaque module.
Hors ligne
Tiens je viens de me rendre compte que si je vire le bootstrap d'un de mes modules il fonctionne toujours....
Je fouille, j'ai du faire autre chose
Hors ligne
Avec le bootstrap ça ne change rien chez moi.
Mon application.ini ressemble à ça :
;====== Resource frontController
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.moduleControllerDirectoryName = "controllers"
resources.frontController.defaultModule = "default"
;====== Resource modules
resources.modules[] = ""
Si je change le defaultModule j'arrive directement sur ma partie admin. Le module default devient à son tour injoinable.
Hors ligne
Et bien c'est encore mieux
Avec ces paramètres là:
;====== Bootstrap bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" ;====== Resource frontController resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.moduleDirectory = APPLICATION_PATH "/../modules" resources.frontController.moduleControllerDirectoryName = "controllers" ;resources.frontController.defaultModule = ;====== Resource modules resources.modules[] = ""
Il retrouve tout seul ses petits.
Le bootstrap de l'application peut rester vide :
<?php /** * Bootstrap de l'application * * @author Benjamin Dulau */ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { }
Et le fichier Bootstrap.php des modules n'est pas obligatoire, au temps pour moi. Tout fonctionne à l'identique sans tout ça.
Tu m'as permis de fouiller et de me rendre compte de code inutile
A+ benjamin.
Hors ligne
Oui en fait on est pas dans le même cas.
Ton module par défaut et tes modules sont tous situés dans un sous-dossier modules du dossier application.
Chez moi le module par défaut est dans application et les autres dans un dossier modules en dehors de application.
Du coup, la ligne
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
n'est pas bonne.
Je réfléchis.
Hors ligne
Delprog a écrit:
Et bien c'est encore mieux
Avec ces paramètres là:
(...)
Tu m'as permis de fouiller et de me rendre compte de code inutile
A+ benjamin.
De rien, si je peux t'aider...
Rmq: effectivement j'ai toujours mon "Message: Invalid controller class ("Admin_IndexController")" sauf sur le module configuré par défaut (que ce soit l'admin ou le default)
Tous mes modules, même celui par défaut, est dans mon répertoire module
Hors ligne
Tu as essayé de changer cette ligne ?
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
Qui, dans ton cas, n'est pas bonne.
Hors ligne
Changer pour quelle valeur ?
Aucun changement pour le moment
Hors ligne
Je peux voir un bout de ta classe Admin_IndexController ?
Hors ligne
Mais il n'y a pas de classe Admin_IndexController
Je n'ai qu'une classe IndexController, voir architecture en première page.
J'ai bien l'impression que c'est un problème de chargement de classe nan?
Hors ligne
Non si tu as deux modules, tu as deux namespaces. Dans ton cas "Default" et "Admin".
Tout tes controlleurs de chaque module doivent être préfixés du namespace.
Si tu as
Application/
modules/
default/
controllers/
IndexController.php
admin/
controllers/
IndexController.php
L' IndexController de default doit être:
class Default_IndexController extends Zend_Controller_Action {}
celui du module admin:
class Admin_IndexController extends Zend_Controller_Action {}
Les fichiers eux s'appellent toujours IndexController.php où qu'ils soient.
Et normalement avec les paramètres dans le ini il s'en sort tout seul.
Hors ligne
Je n'ai pas suivi tout le sujet, mais en lisant tes premiers messages et ton dernier, je pense que j'ai compris xD Dans le module par défaut, les classes de controlleurs doivent avoir pour nom LeNomController, mais dans les autres modules, elles doivent se nommer LeModule_LeNomController. Donc je pense que tu dois simplement rajouter Admin_ au début du nom de ton controlleur Index de ton module Admin. Perso c'est la première erreur que j'ai faîtes avec le ZF
EDIT: Delprog a été plus rapide, et plus clair je pense xD
Dernière modification par aurao (27-07-2009 16:47:16)
Hors ligne
aurao a écrit:
Je n'ai pas suivi tout le sujet, mais en lisant tes premiers messages et ton dernier, je pense que j'ai compris xD Dans le module par défaut, les classes de controlleurs doivent avoir pour nom LeNomController, mais dans les autres modules, elles doivent se nommer LeModule_LeNomController. Donc je pense que tu dois simplement rajouter Admin_ au début du nom de ton controlleur Index de ton module Admin.
Effectivement je viens de m'en rendre compte en testant la dernière réponse de Delprog, le module default dispose d'une classe IndexController et le module admin Admin_IndexController.
Tout est rentré dans l'ordre maintenant, merci à vous tous
Perso c'est la première erreur que j'ai faîtes avec le ZF
Moi c'est la n°1654
Hors ligne
Rah je l'avais soupçonné au début cette erreur, mais je m'étais dit non cette erreur on ne la fait qu'une fois
J'aurais du commencer par là ! :p
Dernière modification par Delprog (27-07-2009 16:50:08)
Hors ligne
Pages: 1 2