PHP Frameworks Teil 1 – Zend Framework

Einleitung

Am 28. Juni dieses Jahres ging das Zend Framework mit der Version 3.0 in eine neue Runde.

Grund genug, unsere Reihe mit diesem PHP Framework zu beginnen. Es zählt zu den verbreitetsten und umfangreichsten Frameworks auf dem Markt. Aber durch seine Mächtigkeit gilt es bei vielen Entwicklern als eher unbeliebt, da es als schwierig zu lernen, umständlich zu konfigurieren und im Vergleich als langsam gilt.

Wir wollen diese Behauptungen ein wenig untersuchen, die Möglichkeiten des Frameworks beleuchten und die Neuerungen der 3. Version vorstellen. Am Ende sollen interessierte Entwickler sich besser entscheiden können, ob sie den Aufwand, das Zend Framework zu lernen, auf sich nehmen wollen.

Hintergründe

Das Zend Framework wurde in der ersten Version im Jahre 2006 veröffentlich. Verantwortlich für das Framework ist das Zend Unternehmen, deren Vorsitzende Zeev Suraski und Andi Gutmans bereits 1997 PHP in der Version 3 neu geschrieben haben und in Folge die Zend Engine entwickelten, welche seit PHP 4 standardmäßig als Interpreter für die freie Sprache PHP zum Einsatz kommt. Neben der Zend Engine finden sich viele weitere PHP-Werkzeuge und Produkte im Portfolio des Unternehmens, wie z.B. Zend Server, die IDE Zend Studio, Apigility oder eben das Zend Framework. Es ist natürlich von Vorteil, wenn man auf eine Reihe von Werkzeugen zurückgreifen kann, die eng miteinander verknüpft sind. Es ist jedoch kein Problem das Zend Framework auch ohne diese zu verwenden und z.B. anstatt dessen auf seine eigene Lieblings-IDE zuzugreifen.

Zu bekannten Projekten, die Zend nutzen, gehören die E-Commerce Plattform Magento und die Google Analytics Alternative Piwik.

Weiterhin veranstaltet Zend seit 2004 jährlich die ZendCon, deren Vorträge sich rund um die Themen PHP im Allgemeinen, Frameworks, Architektur & Design und PHP Software drehen.

Die Beiträge können glücklicherweise auch ganz entspannt von daheim über Youtube jederzeit angesehen werden, lohnenswert für alle, die ihre Kenntnisse über PHP und Webentwicklung erweitern wollen.

Das Zend Framework

Nachdem wir nun einiges über die Hintergründe kennengelernt haben, wollen wir uns nun der wichtigsten Frage widmen: Was genau ist jetzt dieses Zend Framework? Oder besser gefragt: Wie unterscheidet sich ZF von der Vielzahl anderer Frameworks, die derzeit 2016 verfügbar sind?

Warum gibt es denn überhaupt so viele verschiedene Frameworks? Erfüllen sie nicht alle denselben Zweck? Dazu ein ganz klares Jein!

Jedes Framework versucht eine bestimmte Zielgruppe anzusprechen. Diese Zielgruppe definiert sich unter anderem über die Größe und Ansprüche der Projekte und die Vorlieben der Entwickler. Kleine, leichtgewichtige Frameworks (wie z.B CodeIgniter) lassen sich leicht handhaben und ermöglichen es dem Entwickler, in kürzester Zeit einen lauffähigen Prototyp zu schreiben. Das Zend Framework hingegen fällt eher in die entgegengesetzte Kategorie. Es ist komplex und schwerer zu erlernen – je nach Vorkenntnissen im Bereich Objektorientierte Programmierung und Design-Patterns. Im Gegenzug liegt der Vorteil des Frameworks natürlich in genau dieser Komplexität. Wenn man sich einmal eingefuchst hat, kann man eine breite Palette von Funktionalität im Handumdrehen sauber und solide in seinen Projekten umsetzen. Dazu bietet das Zend Framework eine Menge an beliebig kombinierbaren Komponenten.

Die Komponenten

zend_map_large
[2] Komponenten des Zend Framework 1.5

Insgesamt besteht das Zend Framework aus über 60 Komponenten, darunter allgemein nützliche für MVC Klassen, Authentifizierung, Sessionmanagement, Dateiupload, etc., aber auch speziellere, wie Zend-Barcode für Strichcodegenerierung, Zend-Feed für RSS/Atom Feeds oder Zend-Tag, um eigene Objekte mittels Tags zu organisieren.

Welche Komponenten Zend bietet, lässt sich am besten über die Dokumentation unter https://framework.zend.com/learn herausfinden. Dort findet sich zu jeder Komponente eine kleine Beschreibung ihres Nutzens. Um den Rahmen hier nicht zu sprengen, eine kleine unvollständige Liste von Aufgaben, die sich mittels einer Zend Komponente umsetzen lassen:

  • Authentifizierung
  • Rechtekontrolle (ACL / RBAC)
  • Caching
  • Mail
  • Formular Erzeugung und Validierung
  • Cryptographie und XSS-Sicherheit
  • Datenbanken
  • Routing
  • Model – View – Controller Architektur
  • Und neu seit Version 3: PSR-7 und Middleware Unterstützung

Falls es dennoch an Funktionalität mangelt, lässt sich das Framework über Module erweitern, die von der Community bereitgestellt und gepflegt werden.

Um zu vermeiden, dass Projekte durch ungenutzte Funktionalitäten sinnlos aufgebläht werden, wurde bei der Entwicklung der Komponenten auf lose Kopplung gesetzt. Das bedeutet, dass nur die Teile des Frameworks eingebunden werden müssen, die für die gewünschte Funktionalität benötigt werden. Man kann das Framework auch beliebig mit anderen Frameworks und Software kombinieren, um sich das Gerüst den Anforderungen des Projekts entsprechend zusammenzustellen.

Zend Framework 2 und seine Schwierigkeiten

Neben der Vielzahl der Komponenten ist ein weiteres wichtiges Merkmal des Zend Frameworks seine unzähligen Konfigurations- und Anpassungsmöglichkeiten. Dies führt jedoch auch zu einem der größten Kritikpunkte an der Version 2 von ZF: Vieles ist übermäßig kompliziert. Als Beispiel hierfür die Konfiguration für die Skeleton-App, sozusagen die Vorlage als Ausgangspunkt für die erste eigene Applikation mit ZF2 : Skeleton App Config

Auch wenn dies für Einsteiger erst mal abschreckend wirkt, liegt der Vorteil doch auf der Hand: Flexibilität. Daher empfiehlt sich das Framework besonders für erfahrene Entwickler, die sowohl das wie der genutzten Konzepte verstehen, als auch das warum. Um bei dem Beispiel der config zu bleiben: Wer schon einmal PHP Unittests geschrieben hat, wird den Luxus von strikt umgesetzter Dependency Injection verstehen.

Das bringt uns zu dem großen Thema Architektur. Nicht nur die des Frameworks, sondern auch der Applikation, die dieses nutzt. Einige Frameworks zwingen den Entwickler sich an bestimmte Konventionen und Best-Practices zu halten, damit die Software funktioniert. Auch bei Zend ist dies ein wichtiges Dogma. Das kann man als Entwickler mögen oder nicht, der Punkt ist jedoch, dass diese Methoden nicht willkürlich gewählt sind, sondern auf der Erfahrung der Entwickler aus der Industrie entstanden sind und auf bekannten Designprinzipien beruhen. Sich an diese zu halten, hilft dem Entwickler somit automatisch, besseren und robusteren Code zu schreiben. Die gute ausführlich getestete Codebasis des Frameworks bringt nochmal zusätzliche Stabilität.

Vorausgesetzt, man versteht die Philosophie dahinter, was uns wieder zu der Lernkurve des ZF bringt. Ein Grund für die Schwierigkeiten beim Erlernen haben wir bereits benannt, die Komplexität. Der zweite Grund ist die nicht sonderlich hilfreiche Dokumentation, da diese oft sehr „Tutorial“-artig ist. Bestimmte Details sind nicht so schnell oder manchmal auch gar nicht herauszufiltern. Da hilft nur noch der Blick in den Quellcode selbst. Das ist gut, um als Entwickler zu lernen, aber schlecht, falls man einfach nur schnell eine Lösung finden will.

Der letzte Punkt, in dem sich Zend von anderen Frameworks unterscheidet, ist die fehlende Model-Schicht. Wobei das etwas pauschal formuliert ist. Genauer gesagt bietet Zend keine Werkzeuge für ORM, sondern der Entwickler muss auf Drittanbieter (z.B. das auch von Symfony genutzte Doctrine) zurückgreifen oder alles selber implementieren. Dazu bietet Zend jedoch ausgefeilte Hilfsmittel, um verschiedene Datenbanksysteme konform einzubinden, und mittels DataTableGateway Interface lassen sich die Tabellen einfach in objektorientierte Klassen übertragen.

Ob das nun ein wirklicher Nachteil ist, hängt wieder einmal von den Vorlieben des Entwicklers und dem Projekt ab. ORM-Tools gelten häufig als Performancekiller, erleichtern einem die Arbeit aber ungemein, vorausgesetzt man möchte noch ein weiteres Werkzeug erlernen.

Aller guten Dinge sind 3

Natürlich sind diese Kritikpunkte an der Zend Company nicht vorbeigegangen und mit der 3. Version des Frameworks wurden neben einer Vielzahl neuer Features auch einige alte Schwächen behoben.

  • Fokus auf Entkopplung der Komponenten. Viele der Komponenten wurden stärker entkoppelt. Sie sind jetzt nicht nur von ihren Abhängigkeiten her gelöster, sondern jede sitzt in einem eigenen Repository, was die Entwicklung der einzelnen Komponenten beschleunigt. Man muss nicht das gesamte Framework updaten, sobald sich eine Komponente ändert. Auch gestaltet sich die Nutzung mit anderen Frameworks einfacher. Das ist besonders hilfreich für alle, die das Zend Framework mehr als Komponentenbibliothek nutzen, anstatt als vollwertiges MVC-Framework.
  • Fokus auf Dokumentation: Jede Komponente besitzt eine eigene Dokumentation, und Änderungen werden nur mit ausreichend Dokumentierung unterstützt. Ob diese nun wirklich ausreichend ist oder immer noch offene Fragen hinterlässt, lässt sich jedoch erst in der Praxis herausfinden.
  • MVC – alles beim alten. An der MVC hat sich prinzipiell nicht viel verändert, neben einigen Performanceverbesserungen hier und da. Jedoch gibt es jetzt eine Erweiterung zur klassischen MVC Architektur: Zend-Expressive.
  • Zend Expressive ist ein Middleware Framework, um Anfragen an die Applikation über beliebige viele Schichten der Software weiterzuleiten, sollte der klassische MVC-Ansatz für die eigenen Ansprüche nicht mehr genügen. Dies funktioniert analog zur Unix Pipelining-Philosophie, in dem die HTTP-Request durch verschiedene Middleware Komponenten geleitet wird, welche jeweils eine spezielle Aufgabe erfüllen.
  • Unterstützung von PHP 7 mit all seinen Vorteilen. Und natürlich die obligatorische generelle Verbesserung der Performance im Vergleich zum Vorgänger.

Fazit

Vollgestopft mit guten Ideen und Technologien, ist das Zend Framework eines der umfangreichsten und flexibelsten Frameworks, die derzeit verfügbar sind. Das ganze kommt jedoch zu dem Preis der schweren Erlernbarkeit. Diese sollte sich jedoch auszahlen, da das Framework wohl noch einige Zeit in vielen Enterprise Projekten Anwendung finden wird und sich daher gut in jedem Portfolio eines Entwicklers macht.

Besonders geeignet ist das Framework für Projekte, die auf längere Zeit robust, wartbar und erweiterbar sein sollen.

Mit der 3. Version sollte jedenfalls für interessierte Entwickler ein neuer Anreiz geschaffen worden sein, sich mit dem Werkzeug auseinanderzusetzen. Sollte es jedoch nicht den eigenen Vorstellungen entsprechen, lohnt es sich einen Blick auf ähnliche Frameworks zu werfen. Besonders sollen hier Symfony und CakePHP genannt werden. Das Zend Framework kann dann immer noch mit einigen seiner Komponenten aushelfen, falls das Lieblingsframework diese nicht oder nur unzufriedenstellend bereitstellt.

Bild-Quellen:

[1] https://framework.zend.com/participate/logos

[2] http://www.codediesel.com/php/zend-framework-map/