02
May
2011

Le routing de symfony 1.4

Par Manu ·  Etiquette(s) : PHP, symfony 1.4, Code

Qu'est ce qu'une URL ?

Une URL, c'est la ligne de texte que vous voyez en haut de votre navigateur internet : Il s'agit de l'adresse de la page que vous visitez.

La première partie, ici www.epinardscaramel.com, est l'adresse de mon serveur web, le reste sont des paramètres.

Le plus souvent, ces paramètres indiquent une suite de dossiers; /blog/test/toto.html signifie "le fichier toto.html, dans le dossier test, qui est dans le dossier blog.

C'est peut être évident pour vous, mais on ne sait jamais. L'an dernier, le blog ReadWriteWeb, après avoir écrit un article mentionnant "facebook login", c'est retrouvé assiègé de commentaires de gens croyant être sur facebook, après une recherche google. Le blog a dû expliquer aux gens que, pour se rendre sur facebook, il fallait taper facebook.com dans la zone de texte, en haut.Smiley heu

Par ailleurs, les navigateurs ont commencé à afficher de moins en moins de l'URL aux utilisateurs. Opera, notamment, cache le http:// et le www, ansi que les paramètres en fin d'URL.

Que fait symfony de différent ?

La plupart des frameworks PHP utilisent l'URL différement; les paramètres ne sont plus une suite de dossiers, mais des mots-clés transmis au framework pour qu'il sache quelle action effectuée. Avec CodeIgniter 1 par exemple, les URLs ont la forme : http://example.com/class/function/id/, le système sait donc quelle fonction appeller. CodeIgniter est maintenant en version deux, mais je ne sais pas comment il gère le routing.

Dans symfony 1.4 en tous cas, le système de routing est très riche : On peut spécifier n'importe quelle URL pour appeller n'importe quelle fonction.

Puisque mon blog a commencé sous codeigniter, quand j'ai réécrit le moteur avec symfony j'ai décidé de conserver les mêmes URLs, telles que /blog/lire/titrearticle.

Comment on configure ça ?

La plupart de la configuration de symfony ce fait à travers des fichiers YAML, et mon routing, par exemple, se définit comme ça :

    lire:
      url:     /:type/lire/:slug
      class:   sfDoctrineRoute
      options: { model: Content, type: object }
      param:   { module: contenu, action: lire }
      requirements:
        sf_method: [get]

On a ici une définition de route, appellée "lire". Elle correspond à l'affichage d'un billet.

"url" indique le chemin que l'on souhaite; dans le premier exemple, il s'agit de :

  1. le "type" du billet
  2. le mot "lire"
  3. le "slug", c.à.d. le titre, du billet

"class" et "options" indiquent à symfony qu'on va lui passer un objet, un instance de la classe "content".

Enfin, "param" indique quel module et quelle action effectuer. Elle aura accès à l'objet défini dans l'URL.

Le dernier élément de la définition, "sf_method: [get]", indique à symfony que cette URL doit être appellée en GET, et non en POST.

Manu