Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-03-2010 15:37:32

Sishare
Membre
Date d'inscription: 09-02-2010
Messages: 89

[Résolu]Probleme action par défaut

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

 

#2 01-03-2010 16:07:26

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu]Probleme action par défaut

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

 

#3 01-03-2010 22:32:37

Sishare
Membre
Date d'inscription: 09-02-2010
Messages: 89

Re: [Résolu]Probleme action par défaut

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

 

#4 01-03-2010 22:44:20

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu]Probleme action par défaut

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

 

#5 02-03-2010 13:54:21

Sishare
Membre
Date d'inscription: 09-02-2010
Messages: 89

Re: [Résolu]Probleme action par défaut

Je précise que j'ai créé mon api avec le zend tool et que j'utilise une classe d'erreur.
Mon bootstrap :

Code:

<?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

Code:

<?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

 

#6 02-03-2010 17:22:36

Gorgoth
Membre
Date d'inscription: 25-02-2010
Messages: 20

Re: [Résolu]Probleme action par défaut

Salut Sishare,

ce serait pas dans l'application.ini qu'il faut lui indiquer quelles sont les actions par défaut?

du genre

Code:

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

Code:

    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é smile

Dernière modification par Gorgoth (03-03-2010 15:13:47)

Hors ligne

 

#7 03-03-2010 10:49:44

Sishare
Membre
Date d'inscription: 09-02-2010
Messages: 89

Re: [Résolu]Probleme action par défaut

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

 

#8 03-03-2010 11:57:32

Sishare
Membre
Date d'inscription: 09-02-2010
Messages: 89

Re: [Résolu]Probleme action par défaut

Bon j'ai testé les deux, ta méthode fonctionne mais si je définis juste indexAction cela ne fonctionne pas .
Le code valide:

Code:

   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

Code:

   3.
          public function indexAction()
   4.
          {
   5.
              $this->render();
   6.
          }
   7.
       
   8.

Hors ligne

 

#9 03-03-2010 13:56:25

Gorgoth
Membre
Date d'inscription: 25-02-2010
Messages: 20

Re: [Résolu]Probleme action par défaut

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

Code:

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à? smile

Hors ligne

 

#10 03-03-2010 17:18:03

Sishare
Membre
Date d'inscription: 09-02-2010
Messages: 89

Re: [Résolu]Probleme action par défaut

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

 

#11 03-03-2010 17:24:57

Gorgoth
Membre
Date d'inscription: 25-02-2010
Messages: 20

Re: [Résolu]Probleme action par défaut

De rien c'est fait pour ça les forums wink

je suis débutant moi aussi et pour la bdd je suis désolé, mais je peux que moyennement (voire pas big_smile) 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 wink

bon courage!

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages