Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour, je viens de commencer une première api ou il y a 2 controller, index et defis.
Lorsque je tape Monapi/public=> accès à index
Monapi/public/index=> accès à index
Monapi/public/index/index=> accès à index
Or, pour accèder à defis je peux y accèder que par Monapi/public/defis/defis, j'aimerais donc que Monapi/public/defis me renvoi à la l'action defisAction par défaut et non à une erreur de page non trouvé
Dernière modification par Sishare (03-03-2010 11:53:51)
Hors ligne
l'action par défaut de ton cotrôlleur est tpujours index. Sauf si tu le spécifie ailleurs (malheureusement je ne me rappelle plus comment).
Donc si tu tape MonApi/public/defis, tu arrivera sur l'action index.
Hors ligne
Euh non je crois pas que tu est compris, lorsque je tape MonApi/public/defis je tombe sur un page not found car il ne trouve pas l'action. Je rappel que je possède 2 controller 2 vues ( en comptant index). Ce que je voudrais c'est quand je tape MonApi/public/defis je tombe dans le controller DefisController avec l'action defisAction. Comme le fait le controller index pour MonApi/public/index.
Hors ligne
normalement si tu tape MonApi/public/defis, il fait MonApi/public/defis/index par défaut en arrière plan.
Regarde du côté du bootstrap ou du controller, il y a une fonction qui permet de définir l'action par défaut, sinon c'est do côté des routes.
Hors ligne
Je précise que j'ai créé mon api avec le zend tool et que j'utilise une classe d'erreur.
Mon bootstrap :
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initView() { // Initialize view $view = new Zend_View(); $view->doctype('XHTML1_STRICT'); $view->headTitle('My Project'); $view->env = APPLICATION_ENV; // Add it to the ViewRenderer $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' ); $viewRenderer->setView($view); // Return it, so that it can be stored by the bootstrap return $view; } }
J'ai fait des recherche sur l'action par défaut mais j'ai pas trouvé.
Mon index.php situé dans le dossier Public
<?php // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); defined('LIBRARY_PATH') || define('LIBRARY_PATH', realpath(dirname(__FILE__) . '/../library')); // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( realpath(APPLICATION_PATH . '/../library'), get_include_path(), ))); /** Zend_Application */ require_once 'Zend/Application.php'; // $front = Zend_Controller_Front::getInstance(); // $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler()); // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run();
Dernière modification par Sishare (02-03-2010 13:56:22)
Hors ligne
Salut Sishare,
ce serait pas dans l'application.ini qu'il faut lui indiquer quelles sont les actions par défaut?
du genre
resources.frontController.defaultAction = "defis"
dans ton cas?
throrin19 a bien compris ce que tu voulais Sishare, comme il te l'a expliqué, dans Zend, un controlleur a par défaut une action, spécifiée dans le FrontController, et qui est "indexAction".C'est pourquoi en allant sur MonApi/public/defis il te plante, car dans l'uri n'est pas spécifié l'action qui aurait du être après "defis", il tente donc d'executer l'action par défaut qui est "index" et qui n'existe pas.
Ce que je viens de citer précédemment pour l'application.ini va modifier l'action par défaut du FrontController et risque de créer des effets de bord indésirables pour tous tes controleurs, comme le fait que en tapant MonApi/public/ tu te retrouves planté car le frontController va tenter d'executer l'action defisAction (pour la raison explicitée precédemment : pas d'action spécifiée dans l'URI) de ton indexController qui n'existe pas. Et donc même si le problème du controlleur defiController sera résolu, il t'aura planté le reste. Ce n'est peut-être pas une bonne solution.
Tu peux peut-être contourner le problème en créant dans ton defisController une méthode __call.
Comme expliqué dans la doc Zend cette méthode est appelée en cas d'action indéfinie. Comme ton action indexAction n'est pas définie dans ton objet defisController, tu pourrais rédiger la méthode __call comme suit
public function __call($method,$args){ if ('Action'== substr($method, -6)){ return $this->_forward('defis'); } throw new Exception('Méthode invalide "' . $method . '" appelée', 500); }
Comme ça lorsque le frontController va appeler la méthode indexAction qui n'existe pas, ton controleur va entrer dans le __call, et comme la méthode defisAction existe, il renverra sur le defisAction grâce au return $this->_forward('defis'); . Le test sert a vérifier que l'on demande bien une method de type action. Si l'on n'execute pas le forward, on entre dans l'exception c'est-à-dire une action mal formatée.
La source de ce que j'avance et sur laquelle je m'appuie --->ici<---
J'espère que ça t'a aidé
Dernière modification par Gorgoth (03-03-2010 15:13:47)
Hors ligne
Merci beaucoup Gorgoth tes explications sont très claires. Je vais essayé ta solution un peut plus tard, mais je me demande si cela ne fonctionnerai pas de définit indexAction dans defisController ainsi que dans tous les autres controller, mais cela est peut être plus crade que ta méthode?
Hors ligne
Bon j'ai testé les deux, ta méthode fonctionne mais si je définis juste indexAction cela ne fonctionne pas .
Le code valide:
1. class MyController extends Zend_Controller_Action 2. { 3. public function indexAction() 4. { 5. $this->render(); 6. } 7. 8. public function __call($method, $args) 9. { 10. if ('Action' == substr($method, -6)) { 11. // Si une méthode d'action n'est pas trouvée, 12. // rediriger vers l'action index 13. return $this->_forward('Nom_De_l'action_du_Controller_vers_lequel_on_veut_la_redirection'); 14. } 15. 16. // pour tout autre méthode, levée d'une exception 17. throw new Exception('Méthode invalide "' . $method . '" appelée', 18. 500); 19. } 20. }
je n'ai pas compris a quoi servais
3. public function indexAction() 4. { 5. $this->render(); 6. } 7. 8.
Hors ligne
Content que mon aide t'ait été utile!
le $this->render va rendre la vue associée a ton controlleur.
Je n'ai pas compris quand tu as dit
Sishare a écrit:
...mais je me demande si cela ne fonctionnerai pas de définit indexAction...
tu voulais dire "mais je me demande si cela ne fonctionnerai pas si je définis un indexAction" ou "mais je me demande si cela ne fonctionnerai pas si pas d'indexAction de definit dans le controlleur"?
si c'est c'est le premier cas, en effet cela ne fonctionnera pas car l'indexAction sera trouvée et donc réalisée, et le __call ne sera pas appelé.
Si c'est le deuxième cas, tu risques fort de faire planter ton script en boucle si tu rediriges vers une action non existante, car tu vas renvoyer vers une action non existante, qui ne sera pas trouvée, et donc un appel a __call sera regénéré, et redirigera vers une action non existante etc. etc. jusqu'a ce que tu arrives à la limite de temps d'exec pour un script permise par ton serveur.
Quand je vois ton dernier post je pense que tu as compris le principe quand tu mets
return $this->_forward(' [b]Nom_De_l'action_du_Controller_vers_lequel_on_veut_la_redirection[/b]');
mais je n'ai pas compris le "mais si je définis juste indexAction cela ne fonctionne pas" que voulais tu dire par là?
Hors ligne
c'était les deux:D j'ai penser au deux merci de ton aide si tu a un peut de temps je suis bloqué a la connexion de bd http://www.z-f.fr/forum/viewtopic.php?id=4846
Sinon je te remerci pour ton aide précieuse
Hors ligne
De rien c'est fait pour ça les forums
je suis débutant moi aussi et pour la bdd je suis désolé, mais je peux que moyennement (voire pas ) t'aider : /
Si ce n'est que j'ai cru voir dans le code que tu as copié dans le topic mis en lien un "/*", je sais pas si c'est une erreur de recopie mais sinon ça risque fortement de planter ton script
bon courage!
Hors ligne
Pages: 1