FeedBundle : un bundle Symfony pour générer des flux RSS/Atom

2012-08-05

  symfony 

Je n'avais pas blogué depuis un petit moment, il était temps de vous tenir informé de mes actualités de développement.

J'ai récemment développé un bundle pour Symfony que j'ai nommé FeedBundle. Ce bundle va vous permettre de générer des flux RSS et/ou Atom à partir des données de vos entités et le tout de façon très simple.

Imaginons, par exemple, une entité Article qui regroupe les articles de votre blog. Il vous suffit d'implémenter une interface sur cette entité selon si vous souhaitez le composant Routing de Symfony pour générer les URLs de vos articles ou non.

ItemInterface : générer une URL via le composant Routing

namespace Bundle\\BlogBundle\\Entity;

use Eko\\FeedBundle\\Item\\RoutedItemInterface;

/**
 * Bundle\\BlogBundle\\Entity\\Article
 */
class Article implements RoutedItemInterface
{
    /**
     * Returns article route name
     * 
     * @return string
     */
    public function getFeedItemRouteName()
    {
        return 'blog_article_view';
    }

    /**
     * Returns article route parameters
     * 
     * @return array
     */
    public function getFeedItemRouteParameters()
    {
        return array('id' => $this->id);
    }
}

Dans ce cas, le bundle utilisera la route disposant de l'identifiant "blog_article_view" et lui passera l'identifiant de l'article.

Vous devez biensûr également implémenter les autres méthodes de l'interface, à savoir :

  • public function getItemFeedTitle() { . . . }
  • public function getItemFeedDescription() { . . . }
  • public function getItemFeedPubDate() { . . . }
RoutedItemInterface : générer une URL manuellement

namespace Bundle\\BlogBundle\\Entity;

use Eko\\FeedBundle\\Item\\ItemInterface;

/**
 * Bundle\\BlogBundle\\Entity\\Article
 */
class Article implements ItemInterface
{
    /**
     * Returns article URL link
     * 
     * @return array
     */
    public function getFeedItemLink()
    {
        return 'http://www.myblog.fr/article/' . $this->slug;
    }
}

Ajoutez la configuration de votre flux
Il vous faudra également fournir quelques informations sur votre flux dans votre fichier "app/config.yml" de la façon suivante :

eko_feed:
    feeds:
        article:
            title:       'Articles'
            description: 'Derniers articles du blog'
            link:        'http://vincent.composieux.fr'
            encoding:    'utf-8'
            author:      'Vincent Composieux' # Seulement requis pour les flux de type Atom

Le tour est joué, il ne nous reste plus qu'à ajouter nos entités à notre flux puis à l'afficher, depuis notre controlleur.
Générer le flux depuis le controller
Nous arrivons maintenant à l'étape crutialle : générer notre flux de type Atom ou RSS depuis un controlleur :

namespace Bundle\\BlogBundle\\Controller;

use Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller;
use Symfony\\Component\\HttpFoundation\\Request;
use Symfony\\Component\\HttpFoundation\\Response;

class BlogController extends Controller
{
    /**
     * Generate the article feed
     *
     * @return Response XML Feed
     */
    public function feedAction()
    {
        $articles = $this->getDoctrine()->getRepository('BundleBlogBundle:Article')->findAll();

        $feed = $this->get('eko_feed.feed.manager')->get('article');
        $feed->addFromArray($articles);

        return new Response($feed->render('rss')); // ou 'atom'
    }
}

Il vous suffit donc d'appeler le service et d'y ajouter vos articles (entités) précédemment récupérés. Le bundle s'occupe ensuite de faire opérer la magie et d'afficher votre flux. Vous pouvez également ajouter des noeuds personnalisés supplémentaires à votre XML si vous le souhaitez.
Pour aller plus loin ?

Je vous invite à vous rendre sur le repository Github du bundle : http://www.github.com/eko/FeedBundle.

N'hésitez également pas à participer si vous souhaitez faire évoluer ce bundle et à m'envoyer des pull requests.

Comments