Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
J'aimerais personnaliser mes URLs avec Zend_Router et je me demandais quelle était la technique la plus "propre" pour le faire.
En ce moment, j'utilise la technique suivante dans mon Bootstrap mais je ne trouve pas ça très propre :
/** * Initialise les routes. */ protected function _initRoutes() { $front = Zend_Controller_Front::getInstance(); $router = $front->getRouter(); // Ajout de la route pour les menus (m) et les pages (p) $router->addRoute('langue', new Zend_Controller_Router_Route_Regex('([a-z]{2})/?', array( 'controller' => 'index', 'action' => 'index' ), array( 1 => 'language' ) ) ); // Ajout de la route pour les menus (m) et les pages (p) $router->addRoute('menus', new Zend_Controller_Router_Route_Regex('([a-z]{2})/([mp])/([0-9]+)\-[A-Za-z\-]+', array( 'controller' => 'index', 'action' => 'index' ), array( 1 => 'language', 2 => 'menu_or_page', 3 => 'id' ) ) ); }
En fait, je souhaiterais avoir des URL de la forme :
www.mondomaine.tld/fr/m/3-nom-du-menu
Où :
- fr : est le code de la langue,
- m : est une lettre qui me sert pour savoir si on demande un menu (m) ou une page (p),
- 3 : l'id de l'élément demandé,
- nom-du-menu : du texte juste pour que l'url soit propre
J'ai vu quelque chose dans le genre :
$route = new Zend_Controller_Router_Route( ':language/:controller/:action/*', array( 'language' => 'en', 'module' => 'default', 'controller' => 'index', 'action' => 'index' ) ); //$router->addRoute('lang_default', $route);
Je trouve ça quand même plus sympa que ce que je fais mais je ne comprends pas trop la chose. Par exemple, comment récupérer l'élément 'language' dans son contrôleur d'action ?
Quelle solution me conseilleriez-vous pour implémenter mes routes avec Zend_Application.
Merci d'avance.
Hors ligne
Bon, pas la moindre réponse !
Finalement, je me suis débrouillé tout seul et j'ai fini par ajouter une méthode dans le bootstrap (héritant de Zend_Application_Bootstrap_Bootstrap).
Si cela peut servir à quelqu'un je pourrais éventuellement poster mon morceau de code.
Hors ligne
Bonjour calvey,
Les éléments écrits dans le pattern des URLs du routeur tels que
:language
Sont des paramètres passés par votre requête.
Donc une expression de ce type vous permettra de récupérer sa valeur dans votre Controller :
$this->getRequest()->getParameter("language")
C'est la base à connaître parfaitement dès que l'on veut faire des URLs personnalisées.
Merci de consulter la documentation qui détaille parfaitement le processus que vous souhaitez mettre en œuvre (cf. article Zend_Controller_Router, rubrique Zend_Controller_Router_Route).
Hors ligne
Merci pour ta réponse thbenda.
J'ai regardé tout ça et j'ai compris le principe maintenant ^^
Pour ma part, j'utilise la version plus courte :
$this->_getParam('language');
Hors ligne
Hum... Merci de lire ceci et cela, pour l'appel aux méthodes magiques...
Ceux qui ont pris cette mauvaise habitude devront sans doute se préparer à écrire plus de code, pour bénéficier d'un framework plus maintenable... dans la version 2.0 du Zend Framework.
Cdlt.
Hors ligne
- 'Favor the explicit over the magical',
- 'Additionally, "magic" methods such as _call(), get(), and _set() have performance implications; they take roughly 6x longer to execute than simply calling a standard method. By favoring explicit calls, we can likely radically improve the baseline performance of the framework.'
Je prend bonne note.
J'apprécie toujours les conseils au sujet des bonnes pratiques : donc un grand merci.
Autant prendre de bonnes habitudes dès le départ
Hors ligne
_getParam et _getAllParams ne sont pas des methodes dites "magic". Et je ne sais pas si ce qui est dit dans les articles les concerne.
Merci de me corriger.
Hors ligne
En regardant le code, on s'aperçoit que la méthode _getParam($param [, $default]) est une méthode protégée qui fait exactement appel à $this->getRequest()->getParam($param) en lui autorisant une valeur par défaut :
protected function _getParam($paramName, $default = null) { $value = $this->getRequest()->getParam($paramName); if ((null === $value) && (null !== $default)) { $value = $default; } return $value; }
Cela n'a rien à voir avec une méthode "magic" mais thbenda avait l'air de le penser
Cependant, cela peut peut-être légèrement ralentir le code car on fait quand même appel à une méthode supplémentaire qui rappelle ensuite la méthode voulue.
Hors ligne
Ok, je vois un intérêt à _getParam par rapport à getParam, c'est que l'on peut spécifier une valeur par défaut ce que ne propose visiblement pas getParam de request.
Hors ligne
Bonjour,
Qu'elle soit magique ou pas, peu m'importe.
L'idée est qu'elle introduit une étape pas toujours nécessaire.
Quand tu as besoin d'une valeur par défaut pour ton paramètre, alors il te suffit de fixer la valeur par défaut de ton paramètre... pour être tranquille.
Le reste du temps, si tu n'as pas besoin d'une valeur par défaut...
Bonne journée!
Hors ligne
En fait, _getParam et getParam produisent le même résultat.
On peut utiliser $this->getRequest()->getParam($paramName[, $default = null]) avec une valeur par défaut aussi.
Hors ligne
Oui, elles produisent le même résultat, et c'est bien normal!
C'est un accesseur... qui accède à la propriété pour la modifier selon les besoins du développeur.
Et oui, je me suis trompé sur la nature de la méthode _getRequest(), sans aucun doute à cause de cette fichue manie de préfixer méthodes et attributs par un underscore.... manie qui ne me plait pas du tout. Je préfère de très loin la notation CamelCase. Avec cette méthode, il devient impossible de confondre méthodes magiques et méthodes normales.
Par ailleurs, je tiens à faire remarquer que les méthodes magiques du langage PHP prennent 2 underscores comme préfixe... On les distingue facilement grâce à cela:
C'est du code comme ceci:
__autoload() __call() __init() __get() __set() __toString()
Sans doute la notation rappelée par Matthew et reportée par calvey m'a-t-elle involontairement induite en erreur.
cf ce post plus haut.
A moins que le comportement ne soit pas aussi simple que le prototype de la méthode _getParam() pourrait le laisser penser: préfixer les méthodes d'un underscore quand elles font appel à des méthodes magiques dans les classes sous-jacentes du framework. Et puis, je doute que Matthew se soit trompé dans son article.
Dernière modification par thbenda (18-06-2010 13:33:41)
Hors ligne
Matthew ne se trompe pas. Zend Framework préfixe ses méthodes et propriétés protected et privées par un underscore.
C'est une convention qui est utilisée dans de nombreux langages de programmation dont Zend Framework, dans notre cas.
Tu peux, pour en savoir plus, voir la documentation de Zend Framework sur les conventions de nommage :
For methods on objects that are declared with the "private" or "protected" modifier, the first character of the method name must be an underscore. This is the only acceptable application of an underscore in a method name. Methods declared "public" should never contain an underscore.
Dernière modification par calvey (18-06-2010 14:20:22)
Hors ligne
Merci pour ce lien, utile.
Donc ce n'est qu'une simple question de visibilité de méthodes... et non pas une question de méthodes magiques.
Question:
Pourquoi ajouter un élément (l'underscore) qui ne sert strictement à rien ?
Si tu veux connaître la visibilité d'une méthode tu te reportes à son prototype dans sa classe: public, protected, private, portée locale. Point barre !
Il faudra vraiment que je prenne le temps de lire tranquillement les arguments développés sur ce lien.
Lien lu, pas d'arguments pour l'application de cette convention de nommage. Juste pour le fun de se compliquer la vie, tout simplement.
Remarques:
1. Zend Framework n'est pas un langage, mais un Framework qui utilise un langage (le PHP ici).
2. C'est pas la première fois que je m'énerve contre ce type de pratique totalement absurde qui n'engendre de la complexité là où il ne devrait pas y en avoir (aussi bien en JAVA qu'en PHP).
Dernière modification par thbenda (18-06-2010 14:55:21)
Hors ligne
thbenda a écrit:
1. Zend Framework n'est pas un langage, mais un Framework qui utilise un langage (le PHP ici).
Je doute que la précision soit très utile .
calvey a écrit:
C'est une convention qui est utilisée dans de nombreux langages de programmation dont Zend Framework, dans notre cas.
C'est vrai que ma phrase n'était pas des mieux formulées. J'aurai du écrire : "C'est une convention qui est utilisée dans de nombreux langages de programmation. Zend Framework utilise cette convention." Mes excuses.
L'intérêt de préfixer par un underscore est tout bêtement de ne pas avoir à chercher dans le code la visibilité (ou portée) de la méthode (ou de la propriété).
C'est vrai que parfois certaines conventions posent à réflexion, comme par exemple en Java, où chaque ligne de commentaire JavaDoc doit se terminer par un point.
Je ne peux pas tout expliquer, mais l'utilisation de conventions comme l'underscore préfixant les éléments protégés ou privés à pour but de faciliter la reprise du travail par d'autres développeurs.
Il existe des conventions plus ou moins compliquées à appliquer. On peut parler de la notation hongroise, par exemple qui à l'avantage de permettre de connaitre à tout moment le type d'une variable rien qu'en voyant son nom mais qui alourdit sensiblement son nommage.
De grandes entreprises utilisent ces conventions pour les même raisons : lisibilité et identification rapide de la portée d'un élément.
Dernière modification par calvey (18-06-2010 15:22:35)
Hors ligne
calvey a écrit:
Je ne peux pas tout expliquer, mais l'utilisation de conventions comme l'underscore préfixant les éléments protégés ou privés à pour but de faciliter la reprise du travail par d'autres développeurs.
Je connais et je comprends tout à fait les raisons liées à certaines conventions de codage.
Seulement, il n'est pas établi que cela facilite systématiquement le travail d'autres développeurs...
Car trop souvent, il faut chercher dans la documentation (quand elle existe) la trace des conventions de codage (quand elles y sont abordées) utilisées par les développeurs sur un projet quelconque...
Quant à la notation hongroise, elle me parait aussi expressive que la notation CamelCase.
Elles sont toutes deux porteuses de sens, sans nécessité d'expliciter en annexe.
C'est nettement moins le cas ici, où nous sommes obligés de consulter la documentation pour dissiper un malentendu possible.
calvey a écrit:
L'intérêt de préfixer par un underscore est tout bêtement de ne pas avoir à chercher dans le code la visibilité (ou portée) de la méthode (ou de la propriété).
Avec les EDIs actuels tels que Eclipse ou Netbeans, la recherche dans le code se limite aujourd'hui à un clic sur la méthode pour voir son prototype apparaître. Même des éditeurs de texte tels que Scite , jEdit ou autres permettent ce genre de fonctionnalités via l'ajout de plugins dédiés à un langage particulier.
Allez, j'arrête de causer pour un si petit underscore
Bonne fin de journée!
Dernière modification par thbenda (18-06-2010 15:53:38)
Hors ligne
thbenda a écrit:
Car trop souvent, il faut chercher dans la documentation (quand elle existe) la trace des conventions de codage (quand elles y sont abordées) utilisées par les développeurs sur un projet quelconque...
Tout à fait d'accord avec toi sur ce point.
Bonne fin de journée aussi !
Hors ligne
Pages: 1