Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-05-2007 20:37:04

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

[Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Bonjour,

Je cherche une solution à mon problème, mais les exemples trouvés (et essayés) ne fonctionnent pas.
J'ai une structure de module à l'intérieur de chacun j'ai plusieurs contrôleurs

admin
          controllers
          models
          views
profile
          controllers
          models
          views
search
          controllers
          models
          views
site
          controllers
          models
          views

Rien d'extraordinaire.  Mais voilà, les liens générés sont souvent longs et pas très bons pour les engins de recherche (plus il y a de sous-dossiers, plus Google considère le contenu de moindre importance).  J'aimerais racourcir certains de mes liens et le Zend_Controller_Router_Rewrite semble tout désigner.

Par exemple, le lien http://localhost/content/liststories/order/pop/ deviendrait http://localhost/stories/

Pour ce faire, j'ai ajouter la route suivante:

$route = new Zend_Controller_Router_Route(
    'stories',
    array(
        'module'      => 'profile',
        'controller' => 'member',
        'action'     => 'liststories'
    )
);
$router->addRoute( 'stories', $route);

, mais le contrôlleur me retourne toujours l'erreur «Invalid controller specified (stories)».  Je sais que le controller n'existe pas, mad!

Quelqu'un a une idée?

Merci!!


Voici une partie de mon fichier index.php ::

include 'Zend/Loader.php';

//autoload will avoid adding row like Zend::loadClass('Zend_View');
function __autoload($class)
{
    #Zend::loadClass($class);
    Zend_Loader::loadClass($class);
}


//Be sure to be able to register (see http://www.kitpages.fr/zf_migration.php)
Zend_Loader::loadClass("Zend_Registry");

//Start session
Zend_Session::start();
//Start session :: access data will be accessible using $value = Zend::registry('session')->value;
$session_ = new Zend_Session_Namespace("namespace");
Zend_Registry::set('session_', $session_);

/**
* Instantiate a Request to set BaseURL
* See later...
*/
$request = new Zend_Controller_Request_Http();

//Define router
$router = new Zend_Controller_Router_Rewrite();
$router->getRoutes();
$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$route = new Zend_Controller_Router_Route(
    'stories',
    array(
        'module'      => 'profile',
        'controller' => 'member',
        'action'     => 'liststories'
    )
);
$router->addRoute( 'stories', $route);

//Define controller
/*$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('controllers');*/

$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory(array(
  'default'     => PATH_CMS.'/applications/site/controllers',
  'admin'        => PATH_CMS.'/applications/admin/controllers',
  'profile'        => PATH_CMS.'/applications/profile/controllers',
  'search'        => PATH_CMS.'/applications/search/controllers',
));

Dernière modification par zudre (30-05-2007 23:16:15)

Hors ligne

 

#2 10-05-2007 21:46:17

ndesaleux
Membre
Date d'inscription: 16-04-2007
Messages: 196
Site web

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

As tu préfixer tes classes de controleurs par le nom du module comme

module
   Controller
      indexController.php

Accessible via l'URL : monsite.com/module/

le nom de la classe du controler Index doit etre :

Module_IndexController

Je te dis ca de mémoire, car j'ai eu le meme probleme mais j'ai pas le code sous les yeux ni la main

Hors ligne

 

#3 10-05-2007 22:39:21

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Un petit Zend_Debug::Dump() de l'objet de requête, et éventuellement durant le dispatching, pour voir ce qui s'y passe.
Xdebug est aussi une bonne solution

Hors ligne

 

#4 11-05-2007 01:16:50

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Oui, j'ai préfixer mes classes de contrôleur par le nom du module.
En fait, et je me suis sans doute mal exprimé, c'est que je veux faire du modrewrite avec le routeur de Zend. La raison est simple, comme mon .htaccess redirige toute les requêtes vers le index.php, je dois donc trouver une façon de rediriger mes requêtes.

Avec le mod_rewrite, j'aurais ajouté la ligne suivante à mon fichier htaccess

RewriteRule ^stories/?$ content/liststories/order/pop/ [L]

... mais ça ne fonctionne pas.  J'ai donc pensé, en lisant la documentation, que le contrôlleur pouvait intercepter ce genre de requête et rediriger vers le bon :module/:controller/:action/*

Je sais pas si je suis plus clair de cette façon?!

J'ai fait un pas en avant et j'ai maintenant l'erreur «IndexController not found».  J'ai ajouter ceci à mon fichier index.php

$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory(array(
  'default'     => PATH_CMS.'/applications/site/controllers',
  'admin'        => PATH_CMS.'/applications/admin/controllers',
  'profile'        => PATH_CMS.'/applications/profile/controllers',
  'search'        => PATH_CMS.'/applications/search/controllers',
  'stories'    => PATH_CMS.'/applications/site/controllers',
));

//Define router
$router = new Zend_Controller_Router_Rewrite();
$router->getRoutes();
$route = new Zend_Controller_Router_Route_Static(
    'stories',
    array(    'module' => 'site',
            'controller' => 'content',
            'action'    => 'liststories'
    )
);
$router->addRoute( 'stories', $route);
$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));

mais ça ne change rien! Le contrôlleur cherche dans la classe stories l'action indexAction. Déjà que stories existe pas...

Merci de votre aide!

Hors ligne

 

#5 11-05-2007 01:37:49

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Voici le dump de l'objet requête (Zend_Controller_Request_Http)

object(Zend_Controller_Request_Http)#3 (13) {
  ["_requestUri:protected"] => string(16) "/nvitest/stories"
  ["_baseUrl:protected"] => NULL
  ["_basePath:protected"] => NULL
  ["_pathInfo:protected"] => string(0) ""
  ["_params:protected"] => array(0) {
  }
  ["_aliases:protected"] => array(0) {
  }
  ["_dispatched:protected"] => bool(false)
  ["_module:protected"] => NULL
  ["_moduleKey:protected"] => string(6) "module"
  ["_controller:protected"] => NULL
  ["_controllerKey:protected"] => string(10) "controller"
  ["_action:protected"] => NULL
  ["_actionKey:protected"] => string(6) "action"
}

Hors ligne

 

#6 11-05-2007 11:12:21

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Bonjour,

Pour ton exemple de 1h16 du mat (!), il faut ajouter ta route "stories" à la fin. C'est la dernière route ajoutée qui est prioritaire.

A priori, tu n'as pas besoin de rewrite en plus pour cette requête si tu as déjà une rewrite qui balance tout sur index.php.

Code:

$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
// à mettre à la fin pour qu'elle soit prioritaire
$router->addRoute( 'stories', $route);

Sinon ça me parrait bizarre que tu aies 3 fois la même route pour 'admin', 'profile' et 'search', mais je n'ai pas trop creusé les modules, c'est peut-être normal...

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#7 11-05-2007 14:25:26

zudre
Membre
Date d'inscription: 10-05-2007
Messages: 21

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Le 1h16 du matin s'explique parce que je suis au Québec... et non pas parce que je suis un oiseau de nuit ;-)

Les trois routes sont pour les modules.  C'est la seul façon que j'ai trouvé de faire un match entre mes modules (et les contrôlleurs) et la route.  Si j'enlève les trois routes identiques et que j'en renomme une «default», toutes les requêtes sont dirigées vers mon module par défault ('default'     => PATH_CMS.'/applications/site/controllers'), contrôlleur index, action index.

Finalement, la solution était sous mon nez.  J'ai trouvé le site http://osdir.com/ml/php.zend.framework. … 00265.html la réponse.

Solution finale:

$router->addRoute( 'admin', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'profile', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'stories', new Zend_Controller_Router_Route('stories/*', array('module' => 'site', 'controller' => 'content', 'action' => 'listarticle')));
$router->addRoute( 'pictures', new Zend_Controller_Router_Route('pictures/*', array('module' => 'site', 'controller' => 'content', 'action' => 'listgallery')));

Par contre, Philippe, j'ai beau changer l'order de mes routes, la priorité sur la dernière ne semble pas changer grand chose.  Comme j'ai toujours mon long lien http://localhost/content/liststories/order/pop/ possible, même si je met ma route stories en premier, l'url n'est plus interprété et me retourne l'erreur «Invalid controller specified (listarticle)».  Il semble donc que le contrôlleur ne prenne pas en considération l'ordre, mais bien la route qui correspond le plus à ce qui est demandé.

Est-ce possible?

Hors ligne

 

#8 11-05-2007 14:51:26

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Zend_Controller_Router_Route][0.9.2] Créer une route RÉSOLU

Bonjour,

A priori (en tout cas jusqu'au ZF 0.9.1), le ZF prend la première route qui correspond à l'URL en commençant par la fin :
Si on prend ces 2 routes :

Code:

$router->addRoute( 'search', new Zend_Controller_Router_Route(':module/:controller/:action/*'));
$router->addRoute( 'stories', new Zend_Controller_Router_Route('stories/*', array('module' => 'site', 'controller' => 'content', 'action' => 'listarticle')));

l'URL : http://www.monsite.com/stories/ctrl/action/12 vérifie les 2 routes. Dans ce cas il prend la dernière route ajoutée au routeur.

En tout cas bien vu pour le /*, j'avais pas vu smile

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

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