Die wichtigsten Frameworks vorgestellt: PHP-Werkzeugkästen
Die Wahl des richtigen PHP-Frameworks galt unter Webentwicklern lange Zeit als Glaubensfrage. Das hat sich allerdings seit Composer maßgeblich geändert. Denn mit dem Paketmanager ist es möglich, die Abhängigkeiten zu anderen Bibliotheken automatisch zu erkennen und herunterzuladen. Dabei stellt der PHP-Klassen-Autoloader von Composer die Lauffähigkeit der Bibliotheken untereinander und das automatische Laden der notwendigen Klassen sicher. Das war bisher so nicht möglich, die Konfiguration des PHP-Include-Paths oder die Symlinks bildeten dies nur ansatzweise ab.
Composer wirft somit ein neues Licht auf die Landschaft der PHP-Frameworks und hat die Auswahlstrategie fundamental verändert. Die in einem Projekt verwendeten Bibliotheken – und sogar die Abhängigkeiten dieser untereinander – lassen sich durch Composer mit einem einzigen Befehl aktualisieren. Da ist es naheliegend, Komponenten aus verschiedenen PHP-Frameworks und Bibliotheken zu kombinieren, um das bestmögliche Ergebnis zu erzielen.
Zend Framework
Das Zend Framework [1] zählt zu den erfolgreichsten PHP-Frameworks im Enterprise-Segment. Seine Flexibilität und anspruchsvolle Architektur macht die Lernkurve für Entwickler oft steil. Es wendet viele PHP-Design-Patterns praktisch an und enthält einige interessante Ideen (wie etwa das Hydrator-Konzept) in den einzelnen Komponenten.
Eine Zend-Framework-Applikation besteht aus Modulen, die Entwickler frei und entsprechend dem Anwendungszweck konfigurieren können. Das kann ein Web-Service oder Blog-Modul sein. Der Modul-Manager übernimmt das Laden der Module, wodurch sie sich in anderen Zend-Framework-Projekten einbinden lassen. Mittlerweile gibt es auch viele Fremdanbieter-Module, die Entwickler für ein Projekt nutzen können.
Obwohl es sich um ein Full-Stack-Framework handelt, sind die Komponenten
lose gekoppelt. Entwickler können sie einzeln einbinden und mit
anderen PHP-Frameworks kombinieren. Seit das Zend Framework mit Version
2.5 in einzelne Repositories für die Komponenten aufgesplittet ist,
schreitet die Entwicklung rasant voran. Gerade findet ein Refactoring
verschiedener Komponenten statt.
Dabei legen die Zend-Entwickler großen Wert auf die Migration, um
Fehler aus der Vergangenheit zu vermeiden. Die zukünftigen zweier-Releases ebnen den Weg für die neuen Major-Versionen der
verschiedenen Komponenten. Diese beinhalten nicht nur eine erweiterte
Dokumentation im Markdown-Format, sie überzeugen auch durch eine gute
Interoperabilität und Geschwindigkeit. Der Service-Manager in Version 3 ist deutlich schneller und einfacher als der der Version 2.
Interessant sind auch die neuen Komponenten Expressive, Stratigility und Diactoros, die mit PSR-7 (Standard für HTTP-Messages) entstanden sind. Unter Apigility [2] sind verschiedene Komponenten für REST/RPC-Webservices vereint. Diese gelten als Quasi-Standard für Web-Services und erfreuen sich großer Beliebtheit. Das Zend Framework bietet einen Long-Term-Support für Versionen wie etwa 2.4 an.
Symfony
Symfony [3] gilt als eines der führenden PHP-Frameworks und wird vom französischen Dienstleister SensioLabs gesponsert. Ursprünglich hieß es Sensio Framework und wurde von Fabian Potencier entwickelt. SensioLabs bietet auch professionellen Support zu Symfony an.
Das Symfony-Framework erfüllt zwei unterschiedliche Aufgaben. Zunächst bietet es eine Auswahl von Komponenten (Symfony Components) und Bibliotheken von Drittanbietern. Außerdem enthält es sinnvolle Konfigurationsmöglichkeiten, um all diese Bibliotheken zusammenzuhalten. Eine Vielzahl von Content-Management-Systemen und andere PHP-Frameworks nutzen die unabhängigen Symfony-Components. Ziel des Symfony-Frameworks ist es, unabhängige Tools zu integrieren und für Entwickler bereitzustellen.
Auch hier ist eine neue Major-Version in Arbeit. Dank der PSR-HTTP-Message-Bridge lässt sich PSR-7 auch ab Version 2.3 in Symfony einsetzen. Anders als das Zend Framework setzt Symfony auf die eigene Template-Engine Twig [4]. Die View-Templates sollen durch den Verzicht auf die Verarbeitung von PHP-Tags einfacher und leichter lesbar sein. Auch bietet Symfony noch einige zusätzliche Features, etwa das Sandboxing.
Neben dem eigentlichen Framework ist auch das Symfony CMF (Content-Management-Framework) [5] interessant: Ein Werkzeugkasten, um eigene Content-Management-Systeme zu entwickeln und so CMS-Funktionalitäten einfach in eine Symfony-2-basierte PHP-Applikation zu integrieren. Das Symfony CMF besteht aus mehreren Komponenten, sogenannten Bundles.
Um größtmögliche Flexibilität für Bundles zu gewährleisten, sollte man Ressourcen wie Service-Definitionen, Formulare und Templates nicht in Bundles integrieren. So kann man diese besser wiederverwenden und mit Hilfe entsprechender Verbindungsbibliotheken (Bridges) für andere PHP-Frameworks – etwa Laravel – nutzen. Symfony bietet für verschiedene Versionen, wie 2.8, auch einen Long-Term-Support an.
Laravel
Laravel [6] ist im Vergleich zu den beiden vorherigen PHP-Frameworks noch recht jung, auch wenn die aktuelle Versionsnummer 5 etwas anderes vermuten lässt. Das Framework will Entwicklern ein Rundum-sorglos-Paket bieten und sie mit einfacher Abstraktion und einer eleganten Syntax begeistern. Außerdem gibt es zahlreiche weitere Laravel-Projekte wie die Vagrant Box Homestead, Cashier (Bibliothek für den Zahlungsanbieter Stripe) und Spark (Bibliothek für SaaS-Anwendungen). Zusätzliche Services wie Envoyer (PHP-Deployment) und Forge (PHP-Server) unterstützen ebenfalls den Entwickler.
Neben dem Core-Framework, das auch einige Symfony-Komponenten verwendet, kommt hauptsächlich das Application-Framework zum Einsatz. Der Laravel-Installer kann es für den Entwickler herunterladen und vorkonfigurieren. Die verschiedenen Komponenten lassen sich sehr einfach über Static-Aufrufe, sogenannte Facades-Klassen, ansteuern, die als Static-Proxies mit den darunterliegenden Klassen im Service-Container arbeiten. Auf Facades können Entwickler auch verzichten und so das Unit-Testing erleichtern.
Laravels Popularität ist auch auf die vielen Ressourcen – wie Blog-Beiträge, Screencasts und Bücher – zurückzuführen. Die Konfigurationsdateien des Application-Frameworks sind sehr ausführlich dokumentiert. Auch die Kommentarzeilen sind knapp gehalten, was die Lesbarkeit steigern soll. Die Namespace-Imports folgen einem speziellen Aufbau, nämlich von kurz zu lang. Laravel bietet seit Version 5.1 einen Long-Term-Support.
Flow
Das von der TYPO3-Community entwickelte Flow [7] ist ein eigenständiges Application-Framework für Web-Anwendungen und die Basis von Neos, einer CMS-Neuentwicklung aus der TYPO3-Community. Ursprünglich als Nachfolger des TYPO3-CMS entwickelt, hat sich Neos und das Entwicklerteam im Mai 2015 von der TYPO3-Association getrennt. Neos wird seitdem unabhängig weiterentwickelt.
Ein wichtiges Ziel von Flow 3.0 ist, dass sich Entwickler auf die Geschäftslogik konzentrieren und wirklich objektorientiert arbeiten können. Aspect-Oriented-Programming, Domain-Driven-Design und Test-Driven-Development sind mit Flow möglich. Wer sich in dieses Thema erst einmal eingearbeitet hat, kann Enterprise-Anwendungen leichter erstellen und warten. Die Konventionen stehen dabei über den Konfigurationsmöglichkeiten. Templates müssen sich zum Beispiel an einem bestimmten Ort befinden. Außerdem gibt es Naming-Conventions, um die Konfiguration der Applikation automatisch vorzunehmen.
Die Security-Komponente von Flow ist komplett überarbeitet und nun mit Privilegien ausgestattet. Die Privilegientypen lassen sich flexibel erweitern und vereinfachen das Zugriffs-Management auf verschiedene Teile der Applikation. Durch das neue Ressourcen-Management können Entwickler Daten auf dem lokalen Dateisystem und auf Amazon S3 sowie Rackspace Cloud Files laden. Dateien lassen sich dabei nun zu Gruppen zusammenfassen und mit Veröffentlichungsregeln versehen.
Obwohl es schon einige Template-Engines gibt, bringt Flow seine eigene Template-Engine namens Fluid mit. Ein eingebauter Development-Web-Server ermöglicht einen schnellen Start ohne einen kompletten Web-Server-Stack. Das User-Management-Paket Typo3.Party gibt es nun standardmäßig nicht mehr, weil es für Projekte ohne User-Management unnötig war. Es lässt sich aber weiterhin einbinden, falls dies notwendig ist. Flow 3.0 benötigt mindestens PHP 5.5. Die Bibliotheken sind aktualisiert: Doctrine auf 2.4, PHPUnit auf 4.5 und vfsStream auf 1.4.
prooph
Neben den klassischen PHP-Frameworks, die meistens einen starken Fokus auf das Entwickeln von Web-Anwendungen legen, gibt es mittlerweile auch Komponenten-Libraries, die sich auf Enterprise-Application-Architecture (EAA) spezialisiert haben. Sie lassen sich unabhängig vom PHP-Framework einsetzen.
Die prooph components [8] sind entstanden, um monolithische PHP-Anwendungen aufzuspalten und diese in eine Service-orientierte Architektur (SOA) zu überführen. Auf diese Weise soll gar nicht erst das Problem gewachsener Strukturen aufkommen.
Gerade für größere Unternehmen, die Business-Anwendungen auf PHP-Basis einsetzen, sind die Open-Source-Lösungen der prooph-Community interessant. Mit dem Service-Bus-Paket können Entwickler zum Beispiel Anwendungen, IT-Systeme und interne wie externe Services über eine Messaging-Infrastruktur vernetzen (ESB). Das schafft neue Möglichkeiten für Schnittstellen und automatisierte Prozesse.
Damit die Entwicklerteams den Überblick nicht verlieren und sie eine lange Lebensdauer von Business-Anwendungen gewährleisten können, nutzten sie hier gerne Domain-Driven-Design (DDD). Dabei stößt man schnell auf die Vorgehensmodelle CQRS – also der Trennung von Lese- und Schreibzugriff – und Event-Sourcing.
Kein Wunder also, dass prooph diese Patterns adressiert. Der prooph-Event-Store kümmert sich um das Speichern aller wichtigen Ereignisse in einer Anwendung. Einmal gespeicherte Events löscht es nicht mehr. Diese im ersten Moment ungewohnte Art der Datenspeicherung ebnet den Weg für detaillierte Daten- und Ereignis-Analysen. Das Business-Intelligence-Team wird sich freuen.
Sowohl der Event-Store als auch der Service-Bus von prooph unterstützen unterschiedliche Adapter für Datenbank- und Messaging-Systeme. Dadurch reicht die vorhandene Infrastruktur meist aus, oder man kann auf Open-Source-Lösungen zurückgreifen, was teure Anschaffungskosten vermeidet.
Nicht nur prooph, sondern auch andere PHP-Projekte beschäftigen sich mit CQRS und Event-Sourcing. Allen voran das Broadway Framework [9], das aktuell nur als Gesamtpaket und zum Zeitpunkt des Drucks in keiner stabilen Version (aktuell 0.7.1) verfügbar ist. Broadway liefert aber ein integriertes Symfony-Bundle und erleichtert somit Symfony-erprobten Entwicklern den Einstieg.
Doctrine (ORM)
Auch wenn Doctrine [10] kein PHP-Framework im eigentlichen Sinne ist, so stellt es doch die führende Lösung für DBAL und ORM in der PHP-Welt dar. Viele PHP-Frameworks nutzen Doctrine als Basis für Datenbank-Verbindungen und objektrelationalen Abbildungen. Die Verwaltung von Datenbankinhalten
geschieht objektorientiert. Der objektorientierte Ansatz ermöglicht ein
abstraktes, von der Datenbank unabhängiges Arbeiten. Abfragen müssen
Entwickler nicht länger in SQL formulieren.
Doctrine besteht aus mehreren Komponenten. Die bekanntesten sind ORM
(Object Relational Mapping) und DBAL (Database Abstraction Layer). Die
ORM-Komponente kümmert sich um das Mappen der Daten aus der Datenbank zu
den Objekten und umgekehrt. Die DBAL-Komponente ist ein
Abstraktions-Layer für verschiedene Datenbanksysteme.
Für CRUD-(Create, Read, Update, Delete)-Anwendungen ist Doctrine 2
besonders gut geeignet. Eine Integration für das Zend Framework und für
Symfony steht zur Verfügung. Allerdings ist der Einsatz von Doctrine bei
sehr schreibintensiven Anwendungen oder für das Reporting weniger
sinnvoll, da das Mappen der relationalen Daten in den Speicher aufwendig
ist.
Bei der Entwicklung sollten Doctrine-Nutzer zuerst die Entitäten
(Objekte) und danach die Beziehung zwischen diesen definieren. Doctrine
generiert dann die Datenbank. Das hat den Vorteil, dass man auf diese
Weise komplett objektorientiert entwickeln und sich später mit dem
Speichersystem auseinander setzten kann. Eine Alternative zu Doctrine
wäre Eloquent [11] oder Propel [12].
Fazit
Der Kampf um das beste Framework ist dank der PHP-Framework-Interop-Group (PHP-FIG) und Composer endgültig vorüber. Ein Full-Stack-Framework hat zwar den Vorteil, dass alle Komponenten aufeinander abgestimmt sind. Dennoch können auch einzelne Bibliotheken, die für einen speziellen Anwendungsfall konzipiert sind, deutlich von Vorteil sein. Entwickler sollten darauf achten, sich nicht zu sehr an ein PHP-Framework zu binden, um Komponenten einfacher austauschen zu können. Oft zeigt sich nämlich erst im Detail, wie gut eine Komponente die Anforderungen erfüllt. Außerdem ist es auch vom jeweiligen Anwendungsfall abhängig, welche Komponente am besten passt.
Natürlich kann einem niemand die Geschäftslogik abnehmen. Doch für den Rest gibt es fast immer passende Lösungen. Microservices und PSR-7-Middlewares sind zudem auf dem Vormarsch, die eine ganz neue Art der Anwendungsumsetzung bieten. Und mit PHP 7 sind diese auch schneller als jemals zuvor.