Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-05-2010 11:33:56

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

[Zend_Router][1.10] Url personnalisées meilleure technique ?

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 :

Code:

    /**
     * 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 :

Code:

    $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

 

#2 31-05-2010 10:38:39

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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

 

#3 08-06-2010 10:57:56

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

Bonjour calvey,

Les éléments écrits dans le pattern des URLs du routeur tels que

Code:

: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 :

Code:

$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).


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#4 08-06-2010 11:05:19

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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 smile :

Code:

$this->_getParam('language');

Hors ligne

 

#5 08-06-2010 11:16:08

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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.


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#6 08-06-2010 11:49:47

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

- '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 smile

Hors ligne

 

#7 18-06-2010 10:47:30

Damien
Membre
Lieu: Tassin la Demi Lune
Date d'inscription: 22-03-2007
Messages: 88

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

_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

 

#8 18-06-2010 11:29:37

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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 :

Code:

    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 wink

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

 

#9 18-06-2010 11:35:04

Damien
Membre
Lieu: Tassin la Demi Lune
Date d'inscription: 22-03-2007
Messages: 88

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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

 

#10 18-06-2010 12:19:52

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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!


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#11 18-06-2010 12:21:52

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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

 

#12 18-06-2010 13:14:05

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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:

Code:

__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)


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#13 18-06-2010 14:19:12

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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

 

#14 18-06-2010 14:46:21

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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)


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#15 18-06-2010 15:20:27

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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 wink.

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

 

#16 18-06-2010 15:42:55

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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 wink
Bonne fin de journée!

Dernière modification par thbenda (18-06-2010 15:53:38)


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#17 18-06-2010 15:47:13

calvey
Membre
Date d'inscription: 21-05-2010
Messages: 15

Re: [Zend_Router][1.10] Url personnalisées meilleure technique ?

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 smile !

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