IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Problème de routage avec Zend_Controller_Router_Route_Regex [ZF 1.11]


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut Problème de routage avec Zend_Controller_Router_Route_Regex
    Bonjour,

    Dans une application disposant de plusieurs modules, j'ai paramétré sur le module Frontend un certain nombre de routes de type Zend_Controller_Router_Route_Regex. Chaque route appelle son propre controlleur et sa propre action.
    Le problème c'est toujours le même controlleur qui est rendu (le dernier) voici le contenu du fichier de configuration (j'utilise Zend_Application).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    ; Rewrite
    ;Home
    resources.router.routes.home.type = "Zend_Controller_Router_Route_Regex"
    resources.router.routes.home.route = "(.+)"
    resources.router.routes.home.defaults.module = "frontend"
    resources.router.routes.home.defaults.controller = "index"
    resources.router.routes.home.defaults.action = "index"
    resources.router.routes.home.map.l = "label"
    resources.router.routes.home.map.l.default = "toto.html"
    resources.router.routes.home.reverse = "index.html"
     
    ;Rooms
    resources.router.routes.rooms.type = "Zend_Controller_Router_Route_Regex"
    resources.router.routes.rooms.route = "(.+)"
    resources.router.routes.rooms.defaults.module = "frontend"
    resources.router.routes.rooms.defaults.controller = "rooms"
    resources.router.routes.rooms.defaults.action = "index"
    resources.router.routes.rooms.map.1 = "label"
    resources.router.routes.rooms.reverse = "chambre.html"
     
    ;Features
    resources.router.routes.features.type = "Zend_Controller_Router_Route_Regex"
    resources.router.routes.features.route = "(.+)"
    resources.router.routes.features.defaults.module = "frontend"
    resources.router.routes.features.defaults.controller = "features"
    resources.router.routes.features.action = "index"
    resources.router.routes.features.map.1 = "label"
    resources.router.routes.features.reverse = "prestations.html"
     
    ;Location
    resources.router.routes.location.type = "Zend_Controller_Router_Route_Regex"
    resources.router.routes.location.route = "(.+)"
    resources.router.routes.location.defaults.module = "frontend"
    resources.router.routes.location.defaults.controller = "location"
    resources.router.routes.location.defaults.action = "index"
    resources.router.routes.location.map.1 = "label"
    resources.router.routes.location.reverse = "acces.html"
    Quand j'appelle mes routes via mon objet Zend_Navigation, l'url est bonne mais le rendu correspond toujours au controlleur "location"

    Je ne sais pas comment faire pour corriger ce problème.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    De la façon dont tu as configuré tes routes (resources.router.routes.home.route = "(.+)") elles "matchent" n'importe quel appel, donc quel que soit l'url saisie, cette route sera donc valide.

    Comme tes trois routes sont dans ce cas, c'est la dernière dans la liste qui "matche" en premier dans tous les cas, les autres sont ignorées.

    Qu'est-ce que tu voulais exactement comme url pour chacun de tes contrôleurs ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut
    Merci Nighty pour ta réponse :
    En fait j'ai bien compris le problème, la recherche se fait en LIFO, et il scane les "routes" donc comme toutes matches, il s'arrête à la première.

    Je t'explique mon problème : je te précise déjà que je connais plutôt bien ZF, mais j'ai du mal avec le Router.

    J'ai fait un site avec un Frontend et un Backend, qui ressemble un peu à un CMS, au début de l'application, pour aller vite, et m'occuper de cela plus tard, je rentrais mes URLS en dur dans mon fichier de config. Depuis j'ai fait un module de gestion des pages, et j'aimerai lui passer l'url stockée en BD.

    Cela est important pour moi, car ce n'est pas moi qui administrerai le site, donc je veux pouvoir laisser la main aux gens pour spécifier l'url voulue.

    Donc j'ai commencé à modifier mon fichier de config pour permettre cette possibilité et c'est là que ça coince. Faire en sorte que l'url soit dynamique car provenant de la BD.

    Voici ce que j'avais fait au départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    ; Rewrite
    ;Home
    resources.router.routes.home.route = "/index.html"
    resources.router.routes.home.defaults.module = "frontend"
    resources.router.routes.home.defaults.controller = "index"
    resources.router.routes.home.defaults.action = "index"
     
    ;Rooms
    resources.router.routes.rooms.route = "/chambre.html"
    resources.router.routes.rooms.defaults.module = "frontend"
    resources.router.routes.rooms.defaults.controller = "rooms"
    resources.router.routes.rooms.defaults.action = "index"
     
    ;Features
    resources.router.routes.features.route = "/prestations.html"
    resources.router.routes.features.defaults.module = "frontend"
    resources.router.routes.features.defaults.controller = "features"
    resources.router.routes.features.defaults.action = "index"
     
    ;Location
    resources.router.routes.location.route = "/acces.html"
    resources.router.routes.location.defaults.module = "frontend"
    resources.router.routes.location.defaults.controller = "location"
    resources.router.routes.location.defaults.action = "index"
     
    ;Contact
    resources.router.routes.contact.route = "/contact.html"
    resources.router.routes.contact.defaults.module = "frontend"
    resources.router.routes.contact.defaults.controller = "contact"
    resources.router.routes.contact.defaults.action = "index"
     
    ;Sitemap HTML
    resources.router.routes.sitemaphtml.route = "/sitemap.html"
    resources.router.routes.sitemaphtml.defaults.module = "frontend"
    resources.router.routes.sitemaphtml.defaults.controller = "sitemap"
    resources.router.routes.sitemaphtml.defaults.action = "index"
     
    ;Sitemap XML
    resources.router.routes.sitemapxml.route = "/sitemap.xml"
    resources.router.routes.sitemapxml.defaults.module = "frontend"
    resources.router.routes.sitemapxml.defaults.controller = "sitemap"
    resources.router.routes.sitemapxml.defaults.action = "sitemap"

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Comme tu as pu le constater, le Zend Framework fournit les outils pour écrire des routes personnalisées mais laisse libre d'implémenter soi même les mécanismes pour automatiser la création de route via une interface.

    A mon avis tu as, dans les grandes lignes, deux solutions :

    Soit créer ta propre route en implémentant Zend_Controller_Router_Route_Interface, qui se chargera de trouver le module / contrôleur / action / paramètres dans la base de données. Cette solution peut à mon avis poser des soucis de performances, il faudrait faire quelques benchs...

    Soit tu peux permettre à ton interface de modifier le fichier de configuration de tes routes : stocke les en dehors de ton application.ini, et écrit dans ce fichier à chaque fois que quelqu'un modifie les routes. Ensuite fait en sorte que ce fichier de configuration soit bien chargé par l'application au démarrage... Il se peut que si il y a beaucoup de routes différentes les performances soient aussi impactées (si il y a 150 routes, ça veut dire jusqu'à 150 appels à la méthode match() par page, contre un seul pour le cas précédent).

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut
    Merci pour ta réponse,

    j'avais pensé à la solution 1 que je préfère, je peux passer par du cache pour optimiser les perfs, je voulais juste être sûr qu'il n'y avait pas déjà une solution ZF qui existait avant de m'engager dans le dev.

    donc j'implémente la classe Zend_Controller_Router_Route_Interface :
    je précise que j'ai fait en sorte d'avoir toutes les infos dans la BD et ils sont également contenues dans le Registre (pour construire ma nav). Donc je peux parcourir le registre pour construire à la volée mes routes, je vais utiliser un plugin sur le RouteShutdown, qu'en penses tu ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut Problème pour implémenter le Zend_Controller_Router_Interface
    En voulant créer moi-même mon propre routeur, je rencontre d'énormes difficultés, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    <?php
     
    class App_Controller_Router extends Zend_Controller_Router_Abstract implements Zend_Controller_Router_Interface 
    {
        public function route(Zend_Controller_Request_Abstract $dispatcher)
        {
            /**
             * @todo Replace with Zend_Request object
             */
            $path = $_SERVER['REQUEST_URI'];
            if (strstr($path, '?')) {
                $path = substr($path, 0, strpos($path, '?'));
            }
     
    		//Une fois qu'on a l'url on va la chercher en DB
    		//print_r($path);exit;
     
            $path = explode('/', trim($path, '/'));
     
            /**
             * The controller is always the first piece of the URI, and
             * the action is always the second:
             *
             * http://zend.com/controller-name/action-name/
             */
            $controller = $path[1];
            $action     = isset($path[2]) ? $path[2] : null;
     
            /**
             * If no controller has been set, IndexController::index()
             * will be used.
             */
            if (!strlen($controller)) {
               $module = 'frontend';
               $controller = 'index';
               $action = 'index';
            }
     
            /**
             * Any optional parameters after the action are stored in
             * an array of key/value pairs:
             *
             * http://www.zend.com/controller-name/action-name/param-1/3/param-2/7
             *
             * $params = array(2) {
             *              ["param-1"]=> string(1) "3"
             *              ["param-2"]=> string(1) "7"
             * }
             */
            $params = array();
            for ($i=3; $i<sizeof($path); $i=$i+3) {
                $params[$path[$i]] = isset($path[$i+1]) ? $path[$i+1] : null;
            }
     
            $actionObj = new Zend_Controller_Dispatcher_Standard($module, $controller, $action, $params);
     
            if (!$dispatcher->isDispatchable($actionObj)) {
                /**
                 * @todo error handling for 404's
                 */
               throw new Zend_Controller_Router_Exception('Request could not be mapped to a route.');
           } else {
               return $actionObj;
           }
        }
     
        public function assemble($userParams, $name = null, $reset = false, $encode = true)
    	{}
     
        public function getFrontController()
    	{}
     
        public function setFrontController(Zend_Controller_Front $controller)
    	{}
     
        public function setParam($name, $value)
    	{}
     
        public function setParams(array $params)
    	{}
     
        public function getParam($name)
    	{}
     
        public function getParams()
    	{}
     
        public function clearParams($name = null)
    	{}
     
        public function addRoute($name, Zend_Controller_Router_Route_Interface $route)
    	{}
    }
    J'ai le message d'erreur suivant
    Fatal error: Call to undefined method Zend_Controller_Request_Http::isDispatchable()
    Quand je mets en commentaires la ligne fautive, j'ai des erreurs sur le dossier des controllers, des layouts, enfin bref, tout part en "sucette" !!
    Quelqu'un a t'il déjà fait ce travail ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo