Créer un flux RSS avec symfony 1.4

. lecture : 2 minutes

Un flux RSS, qu'est ce que c'est ? Il s'agit d'un fichier texte, utilisant une syntaxe compréhensible par un ordinateur. En affichant les billets de mon blog dans un flux RSS, je permet à des logiciels, appellés agrégateurs, de vérifier automatiquement et périodiquement s'il y a des nouveautés sur le site.

Quelqu'un utilisant Google Reader par exemple, peut alors "suivre" de nombreux sites à la fois, sans avoir à vérifier quotidiennement chacun des sites.

Imaginons alors que vous cherchez à créer un flux RSS pour un moteur de blog. Si vous avez déjà une page qui affiche la liste des billets, c'est facile !

Pour epinardscaramel, j'avais déjà la route suivante, pour afficher tous les billets d'un même "type" (blog, test, ou programme) :

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

(cf. le billet sur le routing de symfony, pour comprendre de quoi je parle)

Plutôt que de créer une nouvelle route pour chaque flux RSS que je veux créer, je peux ajouter l'option "sf_format" aux routes existantes; le routing précedant devient alors :

    type_liste:
      url:     /:type.:sf_format
      class:   sfDoctrineRoute
      options: { model: Content, type: object }
      param:   { module: contenu, action: index, sf_format: html }
      requirements:
        sf_method: [get]
        sf_format: (?:html|xml)

Avec cette modification, les URLs de mon site devienent :

  • epinardscaramel.com/blog, pour afficher les billets du blog, et
  • epinardscaramel.com/blog.xml, pour avoir la même chose sous forme de flux RSS.

Symfony reconnait plusieurs types pour "sf_format" : txt, js, css, json, xml, rdf, atom. Une fois sf_format renseigné, symfony se charge d'utiliser le bon header HTTP, et charge le template correspondant :

Dans le cas de mon flux RSS, il ne me restait plus qu'à créer le template "indexSuccess.xml.php", et d'afficher les billets non plus sous forme de liste, mais à l'interieur d'un flux RSS standard, cf. RSS 2.0 Specification, en anglais.