Eigener RSS Feed mit Symfony 2 und Propel ORM

06.01.2014 22:01 Gregor Panek PHP 0

Heute zeige ich euch, wie schnell man mit dem Symfony 2 Framework, Propel (ORM) und mithilfe eines Bundles sich binnen kürzester Zeit seinen eigenen RSS Feed aufbauen kann.

Voraussetzungen und Installation

Damit ihr direkt loslegen könnt, setze ich natürlich voraus, dass ihr bereits eine Entwicklungsumgebung habt und dort das Symfony 2 Framework installiert ist. Als ORM verwende ich hier in diesem Beispiel Propel. Für die Wahl des RSS Bundles habe ich mich für eines, mit den meisten Hits auf KnpBundles heraus gesucht(Für den der KnpBundles nicht kennt, dies ist ein Sammelsurium an verschiedenen Bundles, die für Symfony 2 zur Verfügung stehen). Ein weiteres Kriterium ist für mich auch immer eine gute Dokumentation. Beim FeedBundle vom Entwickler Vincent Composieux, war beides gegeben.

Installation und Konfiguration

Die Installation des Bundles ist dank Composer und der Systemarchitektur von Symfony 2 recht simpel. Ergänzt eure composer.json Datei um folgenden Eintrag

"eko/feedbundle": "dev-master",

und führt anschließend composer.phar update aus.

Als letzten Installationsschritt muss noch das Bundle dem Framework bekannt gegeben werden. Das wird in der AppKernel.php Datei festgelegt:

public function registerBundles()
{
    $bundles = array(
        ...
        new Eko\FeedBundle\EkoFeedBundle(),
    );

    ...

    return $bundles;
}

Konfiguration

Das Bundle wird über die config.yml konfiguriert. Folgende Einträge müssen vorgenommen werden:

eko_feed:
    feeds:
        posts:
            title:       'Gregor Panek - Blog'
            description: 'Neuste Artikel zu meinem Blog'
            link:        'http://www.gregorpanek.de'
            encoding:    'utf-8'
            author:      'Gregor Panek' 

posts: Name für den Feed Manager zum Aufruf der Konfiguration title: Der Titel des RSS Feeds description: Die Beschreibung des RSS Feed link: Der Link zur Webseite encoding: Standardmäßig utf-8 kann aber beliebig geändert werden author: Wird nur bei Atom Feeds benötigt.

Ihr könnt mehrere Feeds hier konfigurieren. Dafür wird auf der selbenen Ebene wie posts ein weiterer Block mit einer Konfiguration eingefügt.

eko_feed:
    feeds:
        posts:
            title:       'Gregor Panek - Blog'
            description: 'Neuste Artikel zu meinem Blog'
            link:        'http://www.gregorpanek.de'
            encoding:    'utf-8'
            author:      'Gregor Panek' 

        news:
            title:       'Gregor Panek - News'
            description: 'Neuigkeiten'
            link:        'http://www.gregorpanek.de'
            encoding:    'utf-8'
            author:      'Gregor Panek'

Euer Model

Nun müsst ihr euer Daten Model als Grundlage für euren RSS Feed auswählen. Eigentlich seid ihr nicht auf irgendein ORM System wie zum Beispiel Propel angewiesen. Ihr könnt auch eine ganz simple Klasse als Datenmodell verwenden. Wichtig ist nur das diese Klasse das ItemInterface des Bundles implementiert.

Benutzt ihr so wie ich Propel, dann wählt ihr euch einfach euer Model hier als Beispiel Post aus und erweitert diese Klasse um das ItemInterface und implementiert die Methoden die von diesem Interface vorgegeben werden.

...
class Post extends BasePost implements ItemInterface
{

    /**
         * This method returns feed item title
          *
          *
          * @return string
         */
        public function getFeedItemTitle()
        {
            return $this->title;
        }

        /**
         * This method returns feed item description (or content)
         *
         *
         * @return string
         */
         public function getFeedItemDescription()
         {
             return $this->teaser;
         }

         /**
         * This method returns feed item URL link
         *
         *
         * @return string
         */
         public function getFeedItemLink()
         {
             return $this->url
         }

         /**
         * This method returns item publication date
         *
         *
         * @return \DateTime
         */
         public function getFeedItemPubDate()
         {
             return $this->createdAt
         }

         ...

Controller

Für die Ausgabe des RSS Feeds ist es sinnvoll eine eigene Route samt Action im Controller zu erstellen. Dann wird das Model mit dem ItemInterface geladen.

public function rssAction(){
$posts = PostQuery::create()->orderByCreatedAt('DESC')->find();

Als nächstes holt ihr euch aus dem Service Container den Feed Manager des Bundles mit der zuvor erstellten Konfiguration in der config.yml.

$feed = $this->get('eko_feed.feed.manager')->get('posts');

Anschließend wird dem Feed Manager das Model mit dem ItemInterface übergeben. Benutzt ihr so wie ich Propel, dann müsst ihr die PropelObjectCollection zu einem array casten, da ansonsten der Feed Manager mit der PropelObjectCollection nichts anzufangen weis und einen Fehler wirft. Glücklicherweise erbt PropelObjectCollection bzw. PropelCollection von ArrayObject, sodass ihr problemlos den cast durchführen könnt.

$feed->addFromArray((array) $posts);

Abschließend muss noch das Response Objekt in der Action Methode zurück gegeben werden.

...
    return new Response($feed->render('atom'));
}

Voila euer eigener RSS Feed ist fertig.

Fazit

Ich habe hier nicht alle Funktionen des Bundles veranschaulicht. So kann man zum Beispiel anstelle des ItemInterfaces auch alternativ das RoutedItemInterface verwenden. Dadurch habt ihr den Vorteil, dass ihr anstelle eines Hard kodierten Links wie in unserem Beispiel eine „named route“ verwenden könnt. Außerdem bietet dieses Bundle auch die Möglichkeit an RSS Feeds auszulesen und daraus Models zu erstellen.

Mir war es aber wichtiger in diesem Beispiel zu zeigen, wie unkompliziert man sich einen eigenen RSS Feed für seine Webseite erstellen kann. Ich glaube, dass ist auch der häufigere Anwendungsfall. Dennoch bietet dieses Bundle eigentlich alles, was man für den Anfang braucht.

Negativ ist mir die große Abhängigkeit zu Zend Framework Komponenten aufgefallen. Spätestens beim Installieren des Bundles ist das sicher dem einen oder anderen schon aufgefallen. Für das simple erstellen von RSS Feeds würde sicherlich auch ein leichtgewichtigeres Bundle ausreichen.

Zurück

0 Kommentare zu Eigener RSS Feed mit Symfony 2 und Propel ORM

Kommentar abgeben