Seite wählen

NETWAYS Blog

Weekly Snap: OSDC 2012 from Start to Finish, with Zend JSON in Between

23 – 27 April was dedicated to the Open Source Data Center Conference with brief digression into Zend JSON context switches by the development team.
From the Puppet, OpenNebula and IPv6 workshops on the conference eve, to the engrossing presentations and evening event after, this year’s OSDC was a resounding success.
We hope you enjoyed the event as much as we did, and look forward to seeing you at the RootCamp in Berlin or Open Source Monitoring Conference later this year.

Zend JSON-Ausgabe

Um JSON mit dem Zend auszuliefern, könnte man auf die harte Tour, Header selbst setzen, Daten enkodieren und layouts deaktvieren oder man nutzt Funktionalitäten, die das Framework schon bietet. Um zum Beispiel JSON direkt zu senden, bedient man sich Zend_Controller_Action_Helper_Json:

class TestController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $data = array(
            'test' => true
        );
        /**
         * Call Zend_Controller_Action_Helper_Json::direct
         */
        $this->_helper->json($data);
    }
}

Über die Url ../test erhalten wir die Ausgabe in JSON inklusive dem korrekten Content-type application/json.
Nachteil dieses Aufruf ist, dass die dispatch loop sofort unterbrochen wird und somit eventuelle Erweiterungen durch Plugins nicht mehr aufgerufen werden.
Besser ist es, den ContextSwitch Action-Helfer zu benutzen, welcher XML und JSON unterstützt, layouts deaktiviert und Header enstrechend setzt:

class TestController extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper
             ->contextSwitch()
             ->addActionContext('index', 'json')
             ->initContext();
    }
    public function indexAction()
    {
        $this->view->test = true;
    }
}

Die JSON-Ausgabe ist nun über die Url ../test?format=json erreichbar.
Um sich den format-Parameter zu sparen, kann man für alle actions im Controller das json-Format erzwingen:

public function init()
{
    /**
     * Force json format
     */
    $this->_request->setParam('format', 'json');
    ...
}

Zum weiterlesen: Zend ContextSwitch

Eric Lippmann
Eric Lippmann
CTO

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.

Einführung zu CouchDB

Bei CouchDB handelt es sich um ein in Erlang geschriebenes dokumentenbasiertes DBMS, das durch sein Design einige interessante Features anbietet.
Die meisten Linux-Distributionen bieten bereits vorgefertigte Pakete an. Unter Ubuntu kann CouchDB z.B. wie folgt installiert werden:
$ sudo apt-get install couchdb
Für den Zugriff auf CouchDB-Datenbanken sind keine speziellen Client-Anwendungen notwendig. Da CouchDB eine HTTP-basierte REST-Schnittstelle anbietet, kann nahezu jeder beliebige HTTP-Client (z.B. curl) verwendet werden, um auf die Daten zuzugreifen.
CouchDB bietet dennoch von Haus aus eine einfache Oberfläche zum Administrieren und Bearbeiten von Datenbanken an. Standardmäßig ist dieses unter http://localhost:5984/_utils/ erreichbar.
Im Gegensatz zu relationalen Datenbanksystemen ist es bei CouchDB nach dem Anlegen einer Datenbank nicht notwendig, ein Datenbankschema in Form von Tabellen zu definieren.
Stattdessen werden JSON-formatierte Dokumente direkt in der Datenbank abgelegt. Jedes Dokument verfügt dabei zunächst nur über zwei Felder:

  • _id: ein eindeutiger Bezeichner für das jeweilige Dokument; wird er vom Benutzer nicht mit angegeben, vergibt CouchDB automatisch eine einzigartige ID
  • _rev: die Revisionsnummer des Dokuments; sie wird bei jedem Update hochgezählt und intern von CouchDB zur Lösung von Konflikten verwendet

Weitere Felder können nach Bedarf beliebig hinzugefügt werden. Dabei ist es möglich, dass mehrere Dokumente unterschiedliche Felder enthalten.
Ein Zugriff auf die Dokumente ist über das _id-Feld möglich. Um über andere Felder nach Dokumenten zu suchen, müssen Views definiert werden. Diese bestehen aus JavaScript-Funktionen, die Dokumente bestimmten Schlüsseln zuordnet.
Um beispielsweise bei einem Blog alle Posts finden zu können, die an einem Donnerstag veröffentlicht wurden, könnte man eine View definieren, die den einzelnen Wochentagen jeweils die entsprechenden Blog-Posts zuordnet. Über die optionale Integration von Apache Lucene ist es auch möglich, Volltextsuchen durchzuführen.
Views werden beim Bearbeiten von Dokumenten aktualisiert und verwenden intern einen binären Baum, um eine ähnliche Performance anzubieten wie Indizes bei relationalen Datenbanksystemen.
Mehr Informationen zu CouchDB-Features wie z.B. Replikation, Dokumenten-Validierung und etlichen weiteren gibt es auf der offiziellen Webseite unter http://couchdb.apache.org/ und im online verfügbaren Buch „CouchDB: The Definitive Guide
“ unter http://guide.couchdb.org/.