Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-05-2008 15:29:10

jawad
Nouveau membre
Date d'inscription: 24-05-2008
Messages: 3

[Résolu] [zend 1.5]Zend_Controller_router_rewrite , module inexistant.

Bonjour,

voilà celà fait plusieurs jours que je me heurte à un problème de rewriting.
je vous explique :

je déclare un routeur dans le bootstrap et charge ses paramètres à l'aide de zend_config_ini.

bout de code bootstrap:

Code:

Zend_Loader::loadClass('Zend_Controller_Router_Rewrite');
//et le reste des classes zend nécessaires à l'app
//...............

$config = new Zend_Config_Ini('app/Configs/config.ini', 'routage');
$router = new Zend_Controller_Router_Rewrite();
$router->addConfig($config, 'routes'); 

//..............

$frontController->setRouter($router)
                                     ->setParam('auth', $auth)
                                     ->setParam('trans', $trans);

les routes définies dans le fichier ini :

Code:

[routage]
//...

routes.login.route = "connexion"
routes.login.defaults.controller = index
routes.login.defaults.action = index


routes.admin.route = "root"
routes.admin.defaults.controller = index
routes.admin.defaults.action = index


routes.default.route = "accueil"
routes.default.defaults.controller = index
routes.default.defaults.action = "index"
//...

les routes sont bonnes en rapport à mon application et les différents chemins des classes également.

et voici en dernier le bout de code qui selon moi me pose problème. celui du plugin dont je me sers pour l'authentification à l'aide de zend_auth et zend_acl:

Code:

    private $_auth;
    private $_acl;
    
    private $_noauth = array('module' => 'login', 'controller' => 'index', 'action' => 'index');
    
    private $_noacl = array('module' => 'login', 'controller' => 'index', 'action' => 'index');
   
    public function __construct($auth, $acl)
    {
        $this->_auth = $auth;
        $this->_acl = $acl;
    }
    

    public function preDispatch(Zend_Controller_Request_Abstract $request)
   {
//...
//identification avec zend_auth , pas de souci je récupère bien l'identification.
//le bout de code suivant n'a rien de spéciale , on peut le retrouver sur bcp de sites en exemple.
//...

            $controller = $request->getControllerName();
            $action = $request->getActionName();
            $module = $request->getModuleName();

           // echo $request->getModuleName(); est vide

            $resource =$module;

            if (!$this->_acl->has($resource)) {
                $resource = null;                
            }
          
                      // bien sur à ce stade la variable $resource est null ce qui est dommageable pour l'accès  aux ressources

            if (!$this->_acl->isAllowed($role, $resource, $action)) {
                if (!$this->_auth->hasIdentity()) {

                    $module = $this->_noauth['module'];
                    $controller = $this->_noauth['controller'];
                    $action = $this->_noauth['action'];
                } else {
                    $module = $this->_noacl['module'];
                    $controller = $this->_noacl['controller'];
                    $action = $this->_noacl['action'];
                }
            }
            else {
                echo " allowed acl : ok</br>";
                
            }
            
            $request->setModuleName($module);
            $request->setControllerName($controller);
            $request->setActionName($action);

je ne comprends pas pourquoi quand je tape l'url :

http://monsite.com/accueil/

il ne prends pas en compte le mappage du routeur et l'objet http qu'il devrait renvoyer.

c'est à dire que la requête http du predispatch ne contient aucun module, c'est la raison pour laquelle zend_acl n'arrive pas à savoir qu'elle est la ressource demandé et modifie systématiquement la requête avec les paramètres de l'objet http par défaut définis dans le tableaux _noacl.(de nombreux print_r() et echo ont été nécessaires pour le déterminer voir le code).

il est évident, si j'utilise Zend_Controller_Front::getInstance()->getRouter()->getCurrentRouteName() pour modifié le nom du module, que j'obtiendrais le résultat souhaité, celà je l'ai testé.
mais est-ce la bonne façon de faire? je pensais que le routage était automatisé à travers tout le mvc!

si j'ai bien suivi la doc officiel le processus de routage est appelé avant les plugins et à ce stade là l'objet http devrait avoir été transformer ou non par le routeur sur base des routes tracèes dans le fichier ini.

ce qu'il y a de curieux c'est quand j'utilise addRoutes au lieu de addConfig j'arrive à accéder à la bonne url (en passant le nom de la route ou avec le nom du module ex:

http://monsite.com/accueil/ ou http://monsite.com/ et encore http://monsite.com/connexion/ ou http://monsite.com/login/

tandis qu'avec addConfig le fait de passer le nom du module engendre un erreur "aucune définition de route n'a été trouvé...etc"

Enfin ce que je désire obtenir c'est la récupération dans l'objet http du predispatch(avec le bon nom du module d'abord traité par le routeur). ou n'ai-je pas le choix de le récuperer par Zend_Controller_Front::getInstance()->getRouter()->getCurrentRouteName()? ou alors qu'on m'explique ce qui m'échappe dans le processus du routage de zend.

merci d'avance pour toutes vos réponses,

Jawad

Dernière modification par jawad (28-05-2008 00:02:14)

Hors ligne

 

#2 27-05-2008 12:19:14

jawad
Nouveau membre
Date d'inscription: 24-05-2008
Messages: 3

Re: [Résolu] [zend 1.5]Zend_Controller_router_rewrite , module inexistant.

alors pas de réponse! bon.

je vais continuer à chercher.

Hors ligne

 

#3 28-05-2008 00:00:17

jawad
Nouveau membre
Date d'inscription: 24-05-2008
Messages: 3

Re: [Résolu] [zend 1.5]Zend_Controller_router_rewrite , module inexistant.

le problème se situait au niveau des routes déclaré dans le fichier de configuration .ini.

Code:

[routage]
//...

routes.login.route = "connexion"
routes.login.defaults.controller = index
routes.login.defaults.action = index


routes.admin.route = "root"
routes.admin.defaults.controller = index
routes.admin.defaults.action = index


routes.default.route = "accueil"
routes.default.defaults.controller = index
routes.default.defaults.action = "index"
//...

ces routes sont correctes apparemment selon toutes les sources à ce sujet sur le net (tuto, code, etc...).
mais aucune de ces sources ne mentionnent le fait qu'avec une apllication comportant plusieurs modules ce code est incomplet.

il faut absolument indiquer le nom du module dans la fichier , comme suit

Code:

//...
routes.default.route = "accueil"
routes.default.defaults.module= "default"
routes.default.defaults.controller = index
routes.default.defaults.action = "index"
//...

problème résolu.

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