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

Autres composants PHP Discussion :

Utilisation de Zend_Controller_Router_Route


Sujet :

Autres composants PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Par défaut Utilisation de Zend_Controller_Router_Route
    Bonjour,
    je suis en train d'étudier le Zend Framework et notamment les routes...

    Zend_Controller_Router_Route_Module est donc la route standard du framework. Il permet de gérer des URL du type :
    module/controller/action/param1/valeur1.1/param1/valeur1.2/param2/valeur2

    L'implémentation de Zend_Controller_Router_Route_Module entrainera la gestion dans l'exemple ci-dessus du paramètre param1 comme un tableau.

    Dans le cas de Zend_Controller_Router_Route, nous avons la possibilité de mettre un caractère joker (wildcard) dans la fin des motifs des URL que nous voulons gérer.
    Ce caractère joker correspond à un (optionnel) enchainement de paramètres et leur valeur : /param1/valeur1/param2/valeur2

    Apparemment, contrairement à Zend_Controller_Router_Route_Module, Zend_Controller_Router_Route ne permet pas qu'un paramètre puisse avoir plusieurs valeurs (et donc être géré comme un tableau).
    Auriez vous une idée de pourquoi ?
    Serait-ce un bug ? un oubli ? ou bien y-a-t-il une bonne raison ?

    Personnellement je sèche.
    Merci par avance pour vos réponses

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 673
    Par défaut
    montre nous le code que tu utilises pour gérer les routes spéciales

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Par défaut
    Je me suis peut être pas bien fait comprendre. Veuillez m'en excuser.
    Ma question ne concerne pas un probleme que je rencontre. Le but de ma démarche est de comprendre la philosophie des choses dans le Zend Framework.
    Je souhaiterais simplement comprendre pourquoi les développers du framework ont décidé de ne pas permettre la même chose que dans Zend_Controller_Router_Route_Module pour Zend_Controller_Router_Route.

    Bout de code pour Zend_Controller_Router_Route_Module :
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
        /**
         * Matches a user submitted path. Assigns and returns an array of variables
         * on a successful match.
         *
         * If a request object is registered, it uses its setModuleName(),
         * setControllerName(), and setActionName() accessors to set those values.
         * Always returns the values as an array.
         *
         * @param string $path Path used to match against this routing map
         * @return array An array of assigned values or a false on a mismatch
         */
        public function match($path, $partial = false)
        {
            $this->_setRequestKeys();
    
            $values = array();
            $params = array();
            
            if (!$partial) {
                $path = trim($path, self::URI_DELIMITER);
            } else {
                $matchedPath = $path;
            }
    
            if ($path != '') {
                $path = explode(self::URI_DELIMITER, $path);
    
                if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) {
                    $values[$this->_moduleKey] = array_shift($path);
                    $this->_moduleValid = true;
                }
    
                if (count($path) && !empty($path[0])) {
                    $values[$this->_controllerKey] = array_shift($path);
                }
    
                if (count($path) && !empty($path[0])) {
                    $values[$this->_actionKey] = array_shift($path);
                }
    
                if ($numSegs = count($path)) {
                    for ($i = 0; $i < $numSegs; $i = $i + 2) {
                        $key = urldecode($path[$i]);
                        $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
                        $params[$key] = (isset($params[$key]) ? (array_merge((array) $params[$key], array($val))): $val);
                    }
                }
            }
            
            if ($partial) {
                $this->setMatchedPath($matchedPath);
            }
    
            $this->_values = $values + $params;
    
            return $this->_values + $this->_defaults;
        }
    
        /**
         * Assembles user submitted parameters forming a URL path defined by this route
         *
         * @param array $data An array of variable and value pairs used as parameters
         * @param bool $reset Weither to reset the current params
         * @return string Route path with user submitted parameters
         */
        public function assemble($data = array(), $reset = false, $encode = true, $partial = false)
        {
            if (!$this->_keysSet) {
                $this->_setRequestKeys();
            }
    
            $params = (!$reset) ? $this->_values : array();
    
            foreach ($data as $key => $value) {
                if ($value !== null) {
                    $params[$key] = $value;
                } elseif (isset($params[$key])) {
                    unset($params[$key]);
                }
            }
    
            $params += $this->_defaults;
    
            $url = '';
    
            if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) {
                if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) {
                    $module = $params[$this->_moduleKey];
                }
            }
            unset($params[$this->_moduleKey]);
    
            $controller = $params[$this->_controllerKey];
            unset($params[$this->_controllerKey]);
    
            $action = $params[$this->_actionKey];
            unset($params[$this->_actionKey]);
    
            foreach ($params as $key => $value) {
                if (is_array($value)) {
                    foreach ($value as $arrayValue) {
                        if ($encode) $arrayValue = urlencode($arrayValue);
                        $url .= '/' . $key;
                        $url .= '/' . $arrayValue;
                    }
                } else {
                    if ($encode) $value = urlencode($value);
                    $url .= '/' . $key;
                    $url .= '/' . $value;
                }
            }
    
            if (!empty($url) || $action !== $this->_defaults[$this->_actionKey]) {
                if ($encode) $action = urlencode($action);
                $url = '/' . $action . $url;
            }
    
            if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) {
                if ($encode) $controller = urlencode($controller);
                $url = '/' . $controller . $url;
            }
    
            if (isset($module)) {
                if ($encode) $module = urlencode($module);
                $url = '/' . $module . $url;
            }
    
            return ltrim($url, self::URI_DELIMITER);
        }
    Bout de code pour Zend_Controller_Router_Route :
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
        /**
         * Matches a user submitted path with parts defined by a map. Assigns and
         * returns an array of variables on a successful match.
         *
         * @param string $path Path used to match against this routing map
         * @return array|false An array of assigned values or a false on a mismatch
         */
        public function match($path, $partial = false)
        {
            if ($this->_isTranslated) {
                $translateMessages = $this->getTranslator()->getMessages();
            }
            
            $pathStaticCount = 0;
            $values          = array();
            $matchedPath     = '';
            
            if (!$partial) {
                $path = trim($path, $this->_urlDelimiter);
            }
            
            if ($path !== '') {
                $path = explode($this->_urlDelimiter, $path);
    
                foreach ($path as $pos => $pathPart) {
                    // Path is longer than a route, it's not a match
                    if (!array_key_exists($pos, $this->_parts)) {
                        if ($partial) {
                            break;
                        } else {
                            return false;
                        }
                    }
                    
                    $matchedPath .= $pathPart . $this->_urlDelimiter;
                    
                    // If it's a wildcard, get the rest of URL as wildcard data and stop matching
                    if ($this->_parts[$pos] == '*') {
                        $count = count($path);
                        for($i = $pos; $i < $count; $i+=2) {
                            $var = urldecode($path[$i]);
                            if (!isset($this->_wildcardData[$var]) && !isset($this->_defaults[$var]) && !isset($values[$var])) {
                                $this->_wildcardData[$var] = (isset($path[$i+1])) ? urldecode($path[$i+1]) : null;
                            }
                        }
                        break;
                    }
    
                    $name     = isset($this->_variables[$pos]) ? $this->_variables[$pos] : null;
                    $pathPart = urldecode($pathPart);
    
                    // Translate value if required
                    $part = $this->_parts[$pos];
                    if ($this->_isTranslated && (substr($part, 0, 1) === '@' && substr($part, 1, 1) !== '@' && $name === null) || $name !== null && in_array($name, $this->_translatable)) {
                        if (substr($part, 0, 1) === '@') {
                            $part = substr($part, 1);
                        }
                        
                        if (($originalPathPart = array_search($pathPart, $translateMessages)) !== false) {
                            $pathPart = $originalPathPart;
                        }
                    }
                    
                    if (substr($part, 0, 2) === '@@') {
                        $part = substr($part, 1);
                    }
    
                    // If it's a static part, match directly
                    if ($name === null && $part != $pathPart) {
                        return false;
                    }
    
                    // If it's a variable with requirement, match a regex. If not - everything matches
                    if ($part !== null && !preg_match($this->_regexDelimiter . '^' . $part . '$' . $this->_regexDelimiter . 'iu', $pathPart)) {
                        return false;
                    }
    
                    // If it's a variable store it's value for later
                    if ($name !== null) {
                        $values[$name] = $pathPart;
                    } else {
                        $pathStaticCount++;
                    }  
                }
            }
    
            // Check if all static mappings have been matched
            if ($this->_staticCount != $pathStaticCount) {
                return false;
            }
    
            $return = $values + $this->_wildcardData + $this->_defaults;
    
            // Check if all map variables have been initialized
            foreach ($this->_variables as $var) {
                if (!array_key_exists($var, $return)) {
                    return false;
                }
            }
            
            $this->setMatchedPath(rtrim($matchedPath, $this->_urlDelimiter));
    
            $this->_values = $values;
            
            return $return;
    
        }
    
        /**
         * Assembles user submitted parameters forming a URL path defined by this route
         *
         * @param  array $data An array of variable and value pairs used as parameters
         * @param  boolean $reset Whether or not to set route defaults with those provided in $data
         * @return string Route path with user submitted parameters
         */
        public function assemble($data = array(), $reset = false, $encode = false, $partial = false)
        {
            if ($this->_isTranslated) {
                $translator = $this->getTranslator();
                
                if (isset($data['@locale'])) {
                    $locale = $data['@locale'];
                    unset($data['@locale']);
                } else {
                    $locale = $this->getLocale();
                }
            }
            
            $url  = array();
            $flag = false;
    
            foreach ($this->_parts as $key => $part) {
                $name = isset($this->_variables[$key]) ? $this->_variables[$key] : null;
    
                $useDefault = false;
                if (isset($name) && array_key_exists($name, $data) && $data[$name] === null) {
                    $useDefault = true;
                }
    
                if (isset($name)) {
                    if (isset($data[$name]) && !$useDefault) {
                        $value = $data[$name];
                        unset($data[$name]);
                    } elseif (!$reset && !$useDefault && isset($this->_values[$name])) {
                        $value = $this->_values[$name];
                    } elseif (!$reset && !$useDefault && isset($this->_wildcardData[$name])) {
                        $value = $this->_wildcardData[$name];
                    } elseif (isset($this->_defaults[$name])) {
                        $value = $this->_defaults[$name];
                    } else {
                        require_once 'Zend/Controller/Router/Exception.php';
                        throw new Zend_Controller_Router_Exception($name . ' is not specified');
                    }
                    
                    if ($this->_isTranslated && in_array($name, $this->_translatable)) {
                        $url[$key] = $translator->translate($value, $locale);
                    } else {
                        $url[$key] = $value;
                    } 
                } elseif ($part != '*') {
                    if ($this->_isTranslated && substr($part, 0, 1) === '@') {
                        if (substr($part, 1, 1) !== '@') {
                            $url[$key] = $translator->translate(substr($part, 1), $locale);
                        } else {
                            $url[$key] = substr($part, 1);
                        }
                    } else {
                        if (substr($part, 0, 2) === '@@') {
                            $part = substr($part, 1);
                        }
                        
                        $url[$key] = $part;
                    }
                } else {
                    if (!$reset) $data += $this->_wildcardData;
                    foreach ($data as $var => $value) {
                        if ($value !== null) {
                            $url[$key++] = $var;
                            $url[$key++] = $value;
                            $flag = true;
                        }
                    }            }
            }
    
            $return = '';
    
            foreach (array_reverse($url, true) as $key => $value) {
                $defaultValue = null;
                
                if (isset($this->_variables[$key])) {
                    $defaultValue = $this->getDefault($this->_variables[$key]);
                   
                    if ($this->_isTranslated && $defaultValue !== null && isset($this->_translatable[$this->_variables[$key]])) {
                        $defaultValue = $translator->translate($defaultValue, $locale);
                    }
                }
                    
                if ($flag || $value !== $defaultValue || $partial) {
                    if ($encode) $value = urlencode($value);
                    $return = $this->_urlDelimiter . $value . $return;
                    $flag = true;
                }
            }
    
            return trim($return, $this->_urlDelimiter);
    
        }
    J'ai mis en gras et en rouge les lignes de code qui montre ce que j'avance.

    Comme vous pouvez le constater, dans la méthode MATCH de Zend_Controller_Router_Route, seule la première valeur d'un paramètre (présent dans la zone "wildcard") est conservée.
    Dans la méthode ASSEMBLE, l'algorithme ne semble pas vérifier si l'une des valeur passées en paramètre est un tableau....

    Voilà j'espere avoir été plus clair.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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