© saicle/Shutterstock.com
Wie Sie Ihre ZF1-Anwendung zum Zend Framework 2 migrieren - Teil 2

Just do it!


Im ersten Teil [1] dieser Artikelserie sind wir auf die Gründe eingegangen, die für und gegen eine Migration vom ZF1 auf das ZF2 sprechen, und haben die Probleme bei einer Migration skizziert. Jetzt geht es unter anderem um die Migration des MVC-Layers.

Als Basis für unsere Migration hatten wir eine ZF1-Anwendung [2] genommen, die alle wesentlichen Bestandteile einer ZF1-Applikation enthielt. Wir haben die SkeletonApplication installiert und damit begonnen, die Startseite zu migrieren. Dabei haben wir Layout, Navigation, Translator, Autoloading sowie das View-Skript migriert und einen CompatibilityListener für Migration von ZF1-Konfigurationseinstellungen eingerichtet. Der Zwischenstand ist auf GitHub zu finden [3] und wir befinden uns dort auf dem Stand des step3-Branches.

In diesem zweiten Teil werden wir uns um die Migration des MVC-Layers für das Blog-Modul kümmern. Das betrifft das Routing, die Navigation, die Action-Controller, die View-Skripte und View-Helper. Außerdem werden wir uns um die Migration der Authentifizierung und Autorisierung kümmern. Zu guter Letzt wird der Model-Layer für das Modul mit all seinen Komponenten migriert. Und dann ist da ja auch noch das User-Modul.

Wichtiger Hinweis

Aufgrund der immensen Anzahl an Listings in diesem Artikel, haben wir uns entschieden, den Code ausschließlich auf GitHub unter https://github.com/PHPMagazin/PHP-Magazin-­2.2014 zur Verfügung zu stellen.

Dafür machen wir nun genau an der Stelle weiter, an der wir beim letzten Mal aufgehört haben. Zur Erinnerung: Wir beziehen uns auf das Repository für die Migration [3] und steigen wieder beim step3-Branch ein:

cd /home/devhost/dev.zf2migration.de git checkout step3

Schritt 4: MVC-Layer für Blog-Modul migrieren

Um den MVC-Layer für das Blog-Modul zum ZF2 portieren zu können, müssen wir folgende Teilschritte umsetzen:

  • Routing migrieren

  • Action-Controller migrieren

  • View-Skripte migrieren

  • View-Helper migrieren

  • Navigation migrieren

  • Services sauber injizieren

  • Adminbereich für Blog migrieren

Schritt 4a: Routing migrieren

Zuerst müssen wir erneut die .htaccess-Datei anpassen, damit alle Anfragen für das Blogmodul zukünftig durch die ZF2-Applikation verarbeitet werden können (Listing 1). Das betrifft alle Routen, die mit einem Sprachschlüssel gefolgt von /blog, /beitrag, /kategorie oder /nut­zer beginnen. Danach müssen die vier Routen in der Datei /module/Blog/config/module.config.php angelegt werden (Listing 2). Die vier Routen lassen sich sicherlich noch optimieren. Sollte die URL-Struktur bei der Migration geändert werden, müssen Sie sicherstellen, dass die alten Routen zumindest für eine Übergangszeit funktionieren und auf die neuen Routen umleiten. Dabei setzen Sie auch den entsprechenden HTTP-Statuscode. Für unsere Migration wollen wir die Struktur jedoch so beibehalten.

Wenn Sie jetzt den URL http://dev.zf2migration.de/de/blog aufrufen, sollten Sie die Fehlermeldung „Page not found. The requested controller could not be mapp­ed to an existing controller class.“ erhalten. Diese Meldung besagt, dass der durch das Routing ermittelte Controller nicht gefunden werden konnte. Das Routing funktioniert damit schon einmal.

Schritt 4b: Action-Controller migrieren

Als Nächstes muss der Action-Controller für das Blog migriert werden. Dafür legen Sie zuerst die Datei /mo­dule/­Blog/src/Blog/Controller/IndexController.php mit allen benötigten Verzeichnissen an. Darin legen Sie dann die entsprechende Klasse IndexController mit den vier Aktionsmethoden an, die wir benötigen (Listing 3). Zusätzlich müssen wir dem ControllerLoad­er den neuen Controller in der /module/Blog/config/module.config.php-Datei bekannt machen (Listing 4). Wenn Sie jetzt einmal die Seite im Browser aufrufen, sollten Sie eine Exception mit der Meldung „Unable to render template "blog/index/index"; resolver could not resolve to a file“ erhalten. Der Controller wird also geladen, nur das entsprechende View-Skript kann nicht gefunden werden.

Bevor wir das View-Skript migrieren, kümmern wir uns aber erst einmal weiter um den Con­troller. Wir beginnen mit der Blog_In­dex­Con­troller::in­dexAction()-Methode aus dem alten ZF1-Blogmodul und kopieren den Inhalt in die In­dex­Con­troller::indexAction() unseres neuen ZF2-Blogmoduls. Jetzt müssen wir folgende Änderungen durchführen: Wir müssen die Ermittlung des page-Parameters ändern, indem wir diesen mithilfe des neuen params-Controller-Plug-ins holen. Wir greifen direkt auf den Service für die Blogbeiträge über die Blog_Service_Ar­ticle::get­Instance()-Methode zu. Später kümmern wir uns noch um eine saubere Injizierung. Der Aufruf des redirect-Controller-Plug-ins muss ebenfalls geändert werden. Wir können dabei direkt auf die Route blog umleiten. Den dritten Parameter setzen wir auf true, damit wir den Sprachschlüssel lang nicht setzen müssen. Außerdem müssen die Werte für das Template an das ViewModel übergeben werden.

Versuchen Sie es einmal selbst. Die anderen drei Methoden müssen Sie auf eine ähnliche Weise überarbeiten, damit sie mit dem neuen ZF2-Controller lauffähig sind. Zum Testen, ob alles geklappt hat, können Sie die gelesenen Daten vor der Übergabe an das ViewModel einfach einmal dumpen. Zum Schummeln finden Sie die erforderlichen Änderungen in Listing 5.

Schritt 4c: View-Skripte migrieren

Damit die View-Skripte gefunden werden können, müssen wir dem View-Manager in der /module/Blog/config/module.config.php-Datei das entsprechende Verzeichnis bekannt machen (Listing 6). Danach legen Sie das Verzeichnis /module/Blog/view/blog/index und darin die vier View-Skripte index.phtml, show.phtml, category.­phtml sowie user.phtml an. Damit sollte der Aufruf von http://dev.zf2migration.de/de/blog im Browser keinen Fehler mehr ausgeben.

Zuerst beginnen wir damit, den Inhalt aus dem index.phtml des alten ZF1-Blogmoduls in die neue Datei /module/Blog/view/blog/index/index.phtml zu kopieren. Hier sind jetzt folgende Dinge zu erledigen: Die Aufrufe der beiden View-Helper showArticle und paginate werden erst einmal auskommentiert. Um die View-Helper kümmern wir uns gleich. Der Aufruf des Url-View-Helpers muss so abgeändert werden, dass die Route blog-article verwendet, der url-Parameter übergeben wird und wir den dritten Parameter auf true setzen, damit der Sprachschlüssel automatisch gesetzt wird.

Auch hier sollten Sie es erst einmal selbst versuchen, bevor Sie sich die Lösung in Listing 7 genauer anschauen. Im Repository finden Sie auch die anderen überarbeiteten View-Skripte, wenn Sie sich später den Branch step4 genauer anschauen. Wenn Sie http://dev.­zf2migration.­de/de/blog erneut aufrufen, sollten Ihnen zumindest die Buttons zum Anzeigen der Artikel angezeigt werden.

Schritt 4d: View-Helper migrieren

Als Nächstes sind die beiden View-Helper showArticle und paginate an der Reihe, wobei wir mit dem View-Helper zur Anzeige eines Artikels beginnen. Dafür legen wir zuerst die Datei /module/Blog/src/Blog/View/Helper/ShowArticle.php an und erweitern darin den abstrakten View-Helper Zend\View\Helper\AbstractHelper\AbstractHelper. In die __invoke()-Methode kopieren wir erst einmal den Inhalt aus dem alten View-Helper aus der ZF1-Anwendung. Dabei verwenden wir dieselben Übergabeparameter für diese Methode. Jetzt müssen wir Folgendes erledigen: Zuerst verschieben wir die Generierung der URLs an den Anfang der Methode, um das Ganze übersichtlicher zu gestalten. Die Aufrufe von $this->view müssen auf $this->getView() geändert werden. Die Parameter für den Url-View-Helper müssen geändert werden, damit der ZF2-View-Helper für die URLs korrekt funktioniert. Zusätzlich muss beim User- und Kategorielink noch der fehlerhafte Aufruf von getName() in getUrl() korrigiert werden.

Der Translate-View-Helper verfügt nicht mehr über einen eingebauten Aufruf von sprintf(), sodass wir uns um die Parameterübergabe selbst kümmern müssen, wenn wir den übersetzten Text mit Parametern versehen wollen.

Der Time-View-Helper ist entfallen, sodass wir unseren neuen ZF2-Date-View-Helper für Datum und Zeit verwenden. Dafür müssen wir gleich den Date-View-Helper nochmal überarbeiten.

Den View-Helper könnten wir noch mit einem eigenen Widget-Template versehen. Doch das machen wir an dieser Stelle nicht.

Das Ergebnis der Umbauarbeiten finden Sie in Listing 8. Zusätzlich muss der neue View-Helper noch dem ViewHelperManager bekannt gemacht werden, was wir in der Datei /module/Blog/config/module.config.php erledigen (Listing 9). Bevor wir den View-Helper in den View-Skripten einsetzen können, müssen wir noch den Date-View-Helper in der Datei /module/Application/src/Application/View/Helper/Date.php anpassen, damit dieser auf nur Zeitwerte ausgeben kann. Wir fügen dafür in den switch()-Aufruf die neue Option timeonly mit den entsprechenden Parametern ein (Listing 10).

Nun können wir in den View-Skripten index.phtml, show.phtml, category.phtml und user.phtml den Aufruf des ShowArticle-View-Helpers wieder auskommentieren. Wenn Sie jetzt wieder http://dev.zf2migration.de/de/blog in Ihrem Browser aufrufen und einige der Beiträge anklicken, sollten sie wieder angezeigt werden. Auch die Links zu den Kategorien und Nutzern sollten nun schon funktionieren. Achten Sie auch darauf, dass im Footer auch auf die aktuelle ZF2-Version hingewiesen wird. Bei der Migration des paginate-View-Helpers gehen wir ähnlich vor:

  • Wir legen die Datei /module/Application/src/Ap­pli­ca­tion/­View/Helper/Paginate.php an.

  • Wir konfigurieren den neuen View-Helper für den ViewHelperManager in der Konfigu...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang