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

Wie Sie Ihre ZF1-Anwendung zum Zend Framework 2 migrieren


Das Zend Framework 2 hat nun mittlerweile ein ganzes Jahr auf dem Buckel. Doch immer noch bleiben viele Entwickler aus verschiedenen Gründen beim Zend Framework 1. Erfahren Sie in diesem Artikel, wie Sie das ZF1 und ZF2 parallel betreiben und Ihre ZF1-Anwendung schrittweise zum Zend Framework 2 migrieren können. Als Basis dient eine kleine Beispielanwendung, die die meisten gängigen Komponenten aus dem Zend Framework 1 einsetzt und zum ZF2 migriert werden soll.

Der Artikel setzt voraus, dass Sie sich bereits mit dem ZF2 auskennen und idealerweise bereits ein eigenes ZF2-Projekt umgesetzt haben. Zudem sollten Sie sich mit Git und GitHub auskennen, da wir mit einigen Repositories arbeiten werden.

Gründe gegen und für eine Migration

Es gibt eine ganze Reihe an Gründen, die gegen eine Migration vom Zend Framework 1 zum Zend Framework 2 sprechen. Manche wirken eher als Ausreden, während andere nicht von der Hand zu weisen sind. So gibt es durchaus technische Gründe, die gegen den Einsatz vom Zend Framework 2 sprechen. Da es auf PHP 5.3 basiert, kann es durchaus vorkommen, dass der Server aufgrund einer älteren Linux-Distribution noch kein PHP 5.3 bereitstellt. Es gibt auch organisatorische Gründe, da einfach die Zeit fehlt, um viele unterschiedliche Projekte zum ZF2 zu migrieren. Oder das ZF2-Know-how bei den zuständigen Entwicklern fehlt einfach, und außerdem fehlt es an Dokumentation, Büchern und Tutorials zum Thema. Der häufigste Grund, der gegen eine Migration spricht, ist jedoch betriebswirtschaftlicher Natur. Der Kunde scheut den zeitlichen und finanziellen Aufwand, da die Anwendung auf dem ZF1 doch einfach funktioniert.

Es gibt aber auch gute Gründe, die für eine Migration sprechen. Wer sich einmal intensiv eingearbeitet hat, wird das ZF2 in der Regel immer dem ZF1 vorziehen. Die Lernkurve ist zu Beginn zwar sehr hoch, aber hat ein Entwickler den Gipfel einmal erklommen, kann er mit Genuss auf der anderen Seite wieder hinuntersausen. Außerdem spricht die Releaseplanung für die Zukunft gegen einen dauerhaften Verbleib auf dem älteren Release. Das Zend Framework 1 wird nicht mehr aktiv weiterentwickelt, und der Support durch die Firma Zend wird 2014 eingestellt werden. Das ZF2 wiederum wird stetig weiterentwickelt, und der Support durch die Zend Technologies wird mindestens bis 2016 aufrechterhalten. Zudem ist bereits für 2014 das ZF3-Release angekündigt. Der Wechsel vom ZF2 zum ZF3 wird sicherlich deutlich einfacher werden als ein Wechsel vom ZF1 zum ZF3.

Es ist also an der Zeit, endlich die vielen tollen ZF1-Anwendungen zum Zend Framework 2 zu migrieren und alte Zöpfe abzuschneiden.

Probleme bei der Migration

Zugegeben, die Thematik ist nicht trivial. Es gibt keinerlei Tools, um ein ZF1-Projekt automatisch zum ZF2 zu migrieren. Dies liegt vor allem daran, dass das Zend Framework 1 viele Freiheiten bietet und keine hundertprozentig feste Struktur verlangt, wie es bei anderen Frameworks der Fall sein kann. Migration per Knopfdruck bleibt somit eine Utopie. Der Migration-Layer, der einst für das Zend Framework 2 angekündigt wurde, ist bis heute ebenfalls noch nicht erschienen, und zwar aus denselben Gründen. Es ist schlichtweg nahezu unmöglich, alle Spezialfälle abzudecken, damit der Migration-Layer auch einigermaßen verlässlich funktioniert. Dies haben auch die Entwickler erkannt und nach einigen Versuchen die Entwicklung eines Migration-Layers nicht weiter verfolgt. Somit gibt es weder ein Tool für die Migration noch einen Layer, der den Parallelbetrieb ermöglicht.

Bleibt die letzte Idee zur Unterstützung der Migrationswilligen: ein Migration-Guide für das Zend Framework 2. Dieser existiert mittlerweile tatsächlich [1], doch ist leider mehr als unvollständig. Es wird unter anderem ein Tool angeboten, mit dem ein Entwickler alte Klassen in PHP-Namensräume umwandeln lassen kann. Dieser Namespacer [2] funktioniert auch erwartungsgemäß, erfordert jedoch in der Regel eine Menge an Nacharbeit, damit das Laden dieser Klassen später auch tatsächlich funktioniert. Das Tool ist somit zwar ganz nett, nimmt jedoch weniger Arbeit ab, als vielleicht gehofft wurde. Vergleichsweise nützlich sind die Tipps, wie Sie das ZF1 und das ZF2 parallel nutzen können. Diese Tipps werden wir uns später auch zunutze machen. Doch damit ist der Migration-Guide leider bereits am Ende (Stand: Mitte August 2013). Gerade die wirklich interessanten Informationen, wie sich die Modelinfrastruktur, der MVC-Bereich, Formulare usw. migrieren lassen, fehlt leider immer noch völlig. Dieser Artikel versucht an dieser Stelle, Abhilfe zu schaffen und stellt eine mögliche Vorgehensweise vor.

Unterschiede des ZF1 zum ZF2

Naturbedingt gibt es viele Unterschiede zwischen dem Zend Framework 1 und seinem Nachfolger. So basiert das ZF2, wie bereits erwähnt, auf PHP 5.3 und macht somit regen Gebrauch von Namespaces, Closures und Late Static Binding – um nur einige Schlagworte zu nennen. Der Wechsel zu Git und GitHub ist zwar in der Regel nur für Frameworkentwickler wirklich relevant, dennoch muss ein ZF2-Einsteiger sich damit zumindest einmal auseinandersetzen. Wichtiger ist schon die Einführung neuer Konzepte wie „echte“ Modularität, Dependency Injection und Event-driven Architecture. Diese Konzepte sollte ein Entwickler verstanden und verinnerlicht haben, um gute ZF2-Anwendungen erstellen zu können.

Konkretere Änderungen sind der Wechsel vom Convention-over-Configuration-Paradigma zum Configuration-over-Convention-Paradigma. Mussten Sie sich beim ZF1 hauptsächlich an die Konventionen halten, um eine lauffähige Anwendung zu programmieren, müssen Sie beim ZF2 nun vieles konfigurieren, das vorher Out of the Box lief. Als Beispiel sind die Action-Controller im ZF1 zu nennen, die in einem bestimmten Verzeichnis mit einem bestimmten Namen liegen mussten, damit sie automatisch geladen werden können. Im ZF2 müssen Sie diese erst konfigurieren, damit sie gefunden werden. Dieser Paradigmenwechsel hat übrigens einen guten Grund und wurde nicht nur aus einer Laune heraus begangen. Um beim Action-Controller-Beispiel zu bleiben: Der Dispatcher muss im ZF2 nun nicht mehr beim Laden eines Controllers die entsprechenden Verzeichnisse durchsuchen, die Datei finden, laden und prüfen, dass sie auch das enthält, was sie verspricht. Stattdessen wird der Action-Controller direkt anhand der Konfigurationsdaten geladen. Das gleiche Prinzip gilt auch für View-Helper, Controller-Plug-ins, Filterklassen, Routen uvm.

Weiter einschneidende Änderungen sind unter anderem der Wegfall von Zend_Registry und Zend_Application, die vollkommene Überarbeitung von Zend_Controller zur Zend\Mvc-Komponente, das Wegfallen des Decorators bei Zend\Form und die Ausgliederung von Zend_Pdf und Zend_Service in eigene Repositories, die nicht mehr zum ZF2-Kern zählen. Zudem sind viele der Internationalisierungskomponenten aus dem Zend Framework 1 wie Zend_Date, Zend_Locale oder Zend_Measure entfallen, da die PHP-Erweiterung ext/intl diese Funktionen bereitstellt. Das ZF2 stellt aber mit Zend\EventManager, Zend\ModuleManager, Zend\ServiceManager, Zend\Di, Zend\Stdlib usw. auch weitere neue Komponenten bereit, die nur zum Teil in ZF-Release 1.12 zurückportiert wurden.

Diese Unterschiede sollten jedem klar sein, der sich an die Migration einer bestehenden ZF1-Anwendung heranwagt. Zudem sollten bereits Erfahrungen mit der Entwicklung einer ZF2-Anwendung vorhanden sein. Wer als erstes ZF2-Projekt eine ZF1-Anwendung migrieren möchte, wird entweder sehr lange brauchen oder im Extremfall gnadenlos scheitern.

ZF1-Beispielanwendung

Als Grundlage dient eine ZF1-Beispielanwendung, die in Abbildung 1 zu sehen ist. Diese Anwendung basiert auf dem 1.12.3-Release und setzt eine Vielzahl der ZF1-Komponenten ein. Neben den Standardkomponenten Zend_Controller, Zend_View, Zend_Db, Zend_Application und Zend_Config kommen auch Zend_Acl, Zend_Auth, Zend_Form, Zend_Filter, Zend_Validate, Zend_Navigation, Zend_Cache, Zend_Session und Zend_Translate zum Einsatz.

eggert_migration_1.tif_fmt1.jpgAbb. 1: ZF1-Beispielanwendung

Die Anwendung wurde in drei Module default, blog und user unterteilt. Dabei liegen alle Dateien aus dem default-Modul tatsächlich im Verzeichnis /application/module/default/ und nicht direkt unter /application/. Dies erleichtert die spätere Migration. Die Anwendung setzt Twitter Bootstrap 2, jQuery, CKEditor und HTML­Purifier ein und demonstriert damit den Einsatz externer Tools zusammen mit dem Zend Framework 1. Der Seitenaufbau enthält ein Menü im Seitenkopf, einen einfachen Footer sowie eine Seitenleiste. Die Seite ist mehrsprachig. Die Suchfunktion ist jedoch nicht implementiert. Damit haben wir eine solide Basis, die wir migrieren können.

Damit Sie die weiteren Schritte selbst nachvollziehen können, steht diese Beispielanwendung auf GitHub für Sie bereit [3]. Sie können das Projekt wie folgt klonen (bitte ggf. die Verzeichnisse anpassen):

> cd /home/devhost > git clone https://github.com/RalfEggert/zf1example dev.zf1example.de > cd dev.zf1example.de

Nach dem Klonen müssen Sie noch drei Dinge erledigen:

  • Sie müssen das Zend-Framework-Release 1.12.3 herunterladen [4], entpacken und die Dateien ins Verzeichnis /library/Zend/ verschieben.

  • Sie sollten einen Virtual Host dev.zf1example.de einrichten, damit Sie das Projekt im Browser ausführen können. Eine Beispielkonfiguration finden Sie in Listing 1.

  • Sie müssen eine Datenbank mit Namen zf1example anlegen (z. B. MySQL) und darin den entsprechenden Datenbank-Dump aus dem Verzeichnis /data/db/ einspielen. Für My­SQL sollten Sie für diese Datenbank zudem einen Benutzer zf1example mit dem Passwort test123 anlegen. Müssen Sie (aus welchen Gründen auch immer) hiervon abweichen, passen Sie die Datenbankkonfiguration bitte in der /application/modules/default/config/application.ini-Datei in den Zeilen 166 bis 171 entsprechend an.

Wenn Sie nun http://dev.zf1example.de/ in Ihrem Browser aufrufen, sollte die Seite ungefähr wie in Abbildung 1 aussehen. Nun können wir loslegen.

Listing 1

<VirtualHost *> ServerName dev.zf1example.de DocumentRoot /home/devhost/dev.zf1example.de/public/ AccessFileName .htaccess <Directory /home/devhost/dev.zf1example.de/public/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost>

Schritt 1: ZF1-Projekt vorbereiten

Voraussetzung für die Migration zum ZF2 ist, dass Sie bereits mindestens PHP 5.3.3 installiert haben. Zudem sollten Sie darüber nachdenken, eine Versionsmanagementsoftware wie z. B. Git einzusetzen. Das erleichtert Ihnen, fehlerhafte Schritte zurückzunehmen oder einzelne Module in verschiedenen Branches zu migrieren.

Für die Migration der ZF1-Beispielanwendung habe ich auf GitHub ein weiteres Projekt für Sie bereitgestellt [5]. Clonen Sie das Projekt wie folgt (bitte ggf. die Verzeichnisse anpassen) und wechseln Sie gleich zum ­Branch step1, der den Ausgangspunkt darstellen soll:

> cd /home/devhost > git clone https://github.com/RalfEggert/zf2migration dev.zf2migration.de > cd dev.zf2migration.de > git checkout step1

Danach legen Sie einen weiteren Virtual Host dev.zf2migration.de an, der ähnlich wie in Abbildung 1 nur mit geändertem Verzeichnis aussehen könnte. Im nächsten Schritt legen Sie die Datenbank zf2migration an, spielen den Datenbank-Dump und legen dafür den Benutzer zf2migration mit dem Passwort test123 an. Wenn Sie im Browser http://dev.zf2migration.de/ aufrufen, sollte die Ausgabe auch wie in Abbildung 1 aussehen.

In diesem Repository wurden im Vergleich zum Ausgangsprojekt bereits einige Anpassungen der Codebasis vorgenommen:

  • Die Verzeichnisse /application, /data und /library wurden umbenannt, indem ein .zf1 angehängt wurde, damit wir diese später leichter von den ZF2-Verzeichnissen unterscheiden können.

  • Die Konfiguration des APPLICATION_PATH sowie des IncludePath in der /public/index.php sowie die Pfade in der /application.zf1/modules/default/config/application.ini-Datei wurden so angepasst, dass Sie auf die geänderten Verzeichnisse verweisen.

  • Die Front-Controller-Datei /public/index.php wurde nach /public/index.zf1.php umbenannt. Zudem wurde die Konfiguration in der /public/.htaccess-Datei entsprechend angepasst (Listing 2).

  • Die geänderten Zugangsdaten für die Datenbank wurden in der Datei /application.zf1/modules/default/config/application.ini eingetragen.

  • Zur Abgrenzun...

Neugierig geworden? Wir haben diese Angebote für dich:

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