Zend Framework Tutorial Sonderausgabe: Update auf Release 0.2.0

Oops, habe ganz vergessen, diesen Beitrag freizuschalten.

In dieser Sonderausgabe des Zend Framework Tutorials werden wir das TravelloBlog auf das vor wenigen Tagen veröffentliche Release 0.2.0 anpassen. Der ursprünglich geplante zwölfte Teil für das Versenden und Empfangen von Trackbacks wird deshalb um eine Woche verschoben. Das Anpassen der bestehenden Tutorialteile ist durchaus zeitintensiv.

Mit dem Release 0.2.0 gab es einige Neuerungen, auch wenn noch nicht alles direkt in der Library des Zend Frameworks aufgenommen worden ist. Die meisten Änderungen sind erst im Incubator vorhanden, so dass ich in dieser Sonderausgabe nur auf die Änderungen an der eigentlichen Library eingehen werde.

Wichtig: Dieses Tutorial setzt die Zend Framework Preview Version 0.2.0 voraus und kann bei der Verwendung einer aktuelleren Version aus dem SVN unter Umständen nicht zu 100% funktionieren. Des weiteren setzt diese Sonderausgabe voraus, dass du das Tutorial bis einschließlich zum elften Teil durchgearbeitet hast.

Auf Release 0.2.0 updaten

Als erstes musst du dir das aktuelle Release 0.2.0 von der Zend Framework Download Seite herunterladen und es in ein Verzeichnis außerhalb des TravelloBlog Projektes entpacken. Im Verzeichnis "/library/zf" löscht du das Unterverzeichnis "/Zend" und die Datei "Zend.php". Du kannst die Dateien aber auch überschreiben.

In deinem Zend Framework Verzeichnis außerhalb des TravelloBlog Projektes suchst du nun das Unterverzeichnis "/library" und kopierst das Unterverzeichnis "/Zend" und die Datei "Zend.php" in das Verzeichnis "/library/zf". Damit ist das Update schon abgeschlossen.

Zend_Config

Als nächstes starte bitte das TravelloBlog in deinem Browser unter der Adresse "http://travelloblog/". Sofort wird dir eine Fehlermeldung angezeigt:

Call to undefined method Zend_Config_Ini::load() in e:\travelloblog\application\config\settings.php on line 53

Wir sehen sofort, in welcher Datei und in welcher Zeile dieser Datei wir nach dem Fehler suchen müssen. Öffne also die Datei "settings.php" im Verzeichnis "/application/config" und navigiere zu Zeile 53.

Das Erstellen eines Zend_Config_Ini Objektes hat sich mit dem neuen Release deutlich vereinfacht. Statt

PHP:
  1. $config = new Zend_Config(Zend_Config_Ini::load($iniFile, $section));

kannst du nun einfach

PHP:
  1. $config = new Zend_Config_Ini($iniFile, $section);

schreiben. Schon wurde der Fehler von eben korrigiert. Wenn du dein TravelloBlog im Browser neu aufrufst, taucht aber gleich der nächste Fehler auf.

Zend_Controller_RewriteRouter

Die nächste Fehlermeldung betrifft den Zend_Controller_RewriteRouter und ist ein wenig umfangreicher als die erste:

Argument 2 passed to Zend_Controller_RewriteRouter::addRoute() must be an object of class Zend_Controller_Router_Route_Interface, called in e:\travelloblog\application\config\settings.php on line 71 and defined in e:\travelloblog\library\zf\Zend\Controller\RewriteRouter.php on line 64

Wir erkennen, dass der Fehler wieder in unserer "settings.php" Datei liegt. Dieses Mal jedoch in Zeile 71. Mit dem Release 0.2.0 erwartet Zend_Controller_RewriteRouter nun die Übergabe eines Zend_Controller_Router_Route Objektes statt der reinen Parameterliste wie bisher.

Ändere also die Zeilen

PHP:
  1. $router = new Zend_Controller_RewriteRouter();
  2. $router->addRoute('actionroute', ':controller/:action/:id', array('controller' => 'article', 'action' => 'index'));
  3. $router->addRoute('404route', 'filenotfound/', array('controller' => 'index', 'action' => 'filenotfound'));
  4. Zend::register('router', $router);

wie folgt ab:

PHP:
  1. $route1 = new Zend_Controller_Router_Route(':controller/:action/:id', array('controller' => 'article', 'action' => 'index'));
  2. $route2 = new Zend_Controller_Router_Route('filenotfound/', array('controller' => 'index', 'action' => 'filenotfound'));
  3.  
  4. $router = new Zend_Controller_RewriteRouter();
  5. $router->addRoute('actionroute', $route1);
  6. $router->addRoute('404route', $route2);
  7. Zend::register('router', $router);

Du kannst die Zend_Controller_Router_Route natürlich auch direkt bei der Übergabe an die addRoute() Methode instantiieren, dann werden die beiden Zeilen nur etwa unübersichtlicher.

Ein Reload des TravelloBlogs in deinem Browser birgt aber gleich den nächsten Fehler. Und zwar steigt der Firefox mit einer Umleitungsschleife aus während der Internet Explorer behauptet, dass die Seite nicht angezeigt werden kann.

Dieses Problem lösen wir, indem wir für den RewriteRouter noch die Rewrite Basis setzen:

PHP:
  1. $router = new Zend_Controller_RewriteRouter();
  2. $router->addRoute('actionroute', $route1);
  3. $router->addRoute('404route', $route2);
  4. $router->setRewriteBase('');
  5. Zend::register('router', $router);

Zum Abschluss der Änderungen für den Zend_Controller_RewriteRouter können wir den Bugfix in unserer Funktion getRewriteBase() in unserer "settings.php" Datei nun wieder herausnehmen:

PHP:
  1. function getRewriteBase()
  2. {
  3.     $url = Zend::registry('router')->getRewriteBase();
  4.    
  5.     return $url;
  6. }

Das war es schon mit den Änderungen für den Zend_Config_RewriteRouter. Wenn du nun das TravelloBlog wieder in deinem Browser aufrufst, sollte wieder alles funktionieren.

Wenn du das TravelloBlog in einem Unterverzeichnis betreibst, musst du das Setzen der Rewrite Basis entsprechend anpassen:

PHP:
  1. $router->setRewriteBase('/travelloblog/public');

Noch einmal Zend_Config

Das nächste Problem ist ein wenig schwieriger zu finden. Lasse dir einmal einen beliebigen Artikel anzeigen und erstelle dann einen neuen Kommentar. Du erhältst mehrere Meldungen, u.a.

Notice: Trying to get property of non-object in e:\travelloblog\application\controllers\CommentController.php on line 41

Notice: Trying to get property of non-object in e:\travelloblog\application\controllers\CommentController.php on line 42

Wenn du den CommentController öffnest, findest du dort folgende Zeilen:

PHP:
  1. <?php
  2.         [...]
  3.         $mail->setFrom($config->mail->defaultsender);
  4.         $mail->addTo($config->mail->defaultrecipient);
  5.         [...]
  6. ?>

Es muss sich also auch wieder um ein Problem mit Zend_Config handeln. Wenn du dir die "settings.ini" Datei im Verzeichnis "/application/config" anschaust, siehst du, dass wir die Angaben für den Default Sender und Empfänger nur im Abschnitt "[production]" aber nicht im Abschnitt "[development]" definiert haben. Die Vererbung mit Hilfe des "extends = production" funktioniert ab Release 0.2.0 also nicht mehr.

Für Abhilfe ist aber schnell gesorgt. Ändere in der "settings.ini" die Zeilen

[development]
extends = production

einfach in

[development : production]

um und versuche erneut einen Kommentar zu erstellen. Die Fehlermeldungen sollten alle verschwunden sein.

Weitere Fehler

Weitere Fehler durch das Upgrade auf Release 0.2.0 konnte ich bisher nicht finden. Wenn du weitere Fehler gefunden hast, melde dich bitte in den Kommentaren, dann kann ich diesen Artikel bei Bedarf ergänzen.

Download

Der aktuelle Stand des Tutorials nach dieser Sonderausgabe kann herunter geladen werden. Die Textdateien "empty.txt" in einigen Verzeichnissen habe ich nur angelegt, weil mein Winzip keine leeren Verzeichnisse im Zip Archiv anlegt:

Die Zip Datei enthält nicht die aktuelle Version des Zend Frameworks. Dies musst du bitte selber in das entsprechende Verzeichnis kopieren.

Zusammenfassung

In dieser Sonderausgabe des Zend Framework Tutorials haben wir unser TravelloBlog für das neue Release 0.2.0 angepasst und sämtliche durch das Upgrade aufgetretenen Fehler beseitigt.

Nach dieser Sonderausgabe kommen wir im nächsten Teil des Zend Framework Tutorials dann zu dem sehr spannenden Thema für das Versenden und Empfangen von Trackbacks mit Hilfe von Zend_Http_Client.

3 Antworten für “Zend Framework Tutorial Sonderausgabe: Update auf Release 0.2.0”

  1. Dino sagt:

    Fatal error: Call to undefined method Zend_Controller_Front::getinstance() in...

    Mh? :D

  2. Dino sagt:

    ok hat sich erledigt, hab das Framework nochmals heruntergeladen...
    Jetzt aber ein neues Problem, der Router erkennt "url/zum/script/www/" den Controller nicht, "url/zum/script/www/index" hingegen schon.
    Obwohl er
    $router->addRoute('default', new Zend_Controller_Router_Route(':controller/:action/:id', array('controller' => 'index', 'action' => 'index')));
    das eingetragen hat... keine ahnung was da los ist!

  3. Mirko sagt:

    Irgendwie habe ich Probleme damit. Bei mir geht Alles nicht mehr!!Hmm
    Ich werde das alles wieder von meinem PC schmeißen und noch mal versuchen.

Hinterlasse eine Antwort