My CakePHP 3 Review – Immer noch frisch, immer noch heiß

Veröffentlicht: 2022-03-11

Im vergangenen Monat kündigte das CakePHP-Team den Start der Alpha-Version von CakePHP 3 an. Das Cake-Entwicklungsteam betrachtet Version 3 als bahnbrechend, daher dauert dieser Artikel mit der Alpha-Version von Version 3, die jetzt heiß aus dem Ofen ist, eine frischen Blick auf CakePHP 3 als effektives modernes Framework für die PHP-Entwicklung.

Dieser CakePHP 3 Leckerbissen ist frisch aus dem Ofen.

Eine kurze Geschichte

Heutzutage gibt es so viele Möglichkeiten, wenn es um die PHP-Entwicklung geht. Mit zunehmender Reife von PHP sind immer mehr PHP-Frameworks auf den Markt gekommen, die Entwicklern eine große Auswahl an Möglichkeiten bieten. Aber das war nicht immer so.

Im Jahr 2005, als PHP 4 noch der Standard war, gab es noch keine PHP-Frameworks und die Entwicklung eines objektorientierten Programmieransatzes in PHP war sicherlich eine Herausforderung. Damals entstand CakePHP – das allererste PHP-MVC-Framework. In den fast 10 Jahren, die seit der ersten Veröffentlichung vergangen sind, hat sich CakePHP kontinuierlich weiterentwickelt und einen gesunden Marktanteil von PHP-Entwicklern gehalten.

Wie beliebt ist das CakePHP-Framework? Es gehört zu den Top 4 der beliebtesten PHP-Projekte auf GitHub, von rund 130.000 Projekten, mit über 18.000 Mitgliedern in der CakePHP-Google-Gruppe mit 32.000 Themen. Mit 270 Mitwirkenden am Code und 320 Mitwirkenden an der Dokumentation lässt sich nicht leugnen, dass CakePHP eine große Fangemeinde hat. Die derzeit weit verbreitete und wachsende Popularität von CakePHP ist in einem Artikel von James Watts, Kernmitglied und Community-Manager von CakePHP für die Cake Software Foundation, gut zusammengefasst, den ich während des Schreibens dieses Artikels interviewt habe.

Mit der jetzt verfügbaren Version 3 des Frameworks wird CakePHP mit Sicherheit eine führende Kraft in der PHP-Welt und ein wichtiger Konkurrent in der heutigen vielfältigen Landschaft der PHP-Frameworks bleiben.

Was ist neu in Version 3 von CakePHP?

Diese Überprüfung basiert auf der Alpha-Version von CakePHP 3.0, die eine Reihe neuer Funktionen und Verbesserungen enthält, darunter:

  • Bessere Leistung. Version 3 enthält Leistungsverbesserungen für den Bootstrap-Prozess, den Routing-Prozess und mehrere Teile des Prozesses zum Generieren von Hilfsvorlagen.

  • Verbesserte Komponenten und Helfer. Version 3 bietet mit dem neuen FlashHelper und FlashComponent eine verbesserte Unterstützung für „Flash-Nachrichten“. Darüber hinaus wurde die CookieComponent erweitert, wodurch es einfacher wird, die Konfiguration von Cookie-Namespaces und die Handhabung von Cookie-Daten zu trennen.

  • Verbesserte Sitzungsverwaltung. Die Sitzungsverwaltung war in CakePHP schon immer eine statische Klasse, die sich in vielerlei Hinsicht als problematisch erwiesen hat. Mit Version 3 können Sie nun über das Request-Objekt $this->request->session() auf die Session zugreifen. Diese Änderung erleichtert auch das Testen der Sitzung und ermöglicht es CakePHP, PHPUnit 4.x zu verwenden.

  • Verbesserte Konsistenz von Konventionen. Das Anwendungsskelett und die Plugin-Skelette wurden aktualisiert, um dieselbe Verzeichnisstruktur zu verwenden, um konsistenter zu sein.

  • Themes und Plugins zusammengeführt. Ein Hauptziel von CakePHP 3 war es, Themes leistungsfähiger und robuster zu machen. Bei der Arbeit an diesem Ziel wurde deutlich, dass es wirklich notwendig war, dass Themes die gleichen Fähigkeiten wie Plugins bieten. Dementsprechend kann nun jedes Plugin als Theme verwendet werden, was auch das Packen und Weiterverteilen vereinfacht.

  • ORM-Verbesserungen. Am ORM (Object-Relational Mapping) wurden mehrere API-Änderungen vorgenommen. Vor allem ist es jetzt einfacher, tiefe Assoziationen für Speicheroperationen anzugeben, und einige Konventionen wurden geändert, um die Lernkurve und Verwirrung bei neuen Benutzern zu verringern.

Darüber hinaus gibt es einige zusätzliche Funktionen, die ebenfalls in die Beta-Version der Version 3.0 integriert werden sollen. Am wichtigsten:

  • Funktionserweiterungen für Internationalisierung und Lokalisierung (i18n und L10n).
  • Ein Ersatz für CacheHelper basierend auf Edge Side Includes
  • Eine neue Routing-API für eine einfachere und schnellere Routendeklaration

Tatsächlich stellt Version 3 ein bedeutendes Upgrade gegenüber früheren Versionen von CakePHP dar.

Warum CakePHP?

Während CakePHP viele großartige Funktionen hat, konzentriert sich diese Rezension auf einige besonders, die wirklich dazu beitragen, es von anderen abzuheben, nämlich:

  • Konvention über Konfiguration
  • CakePHPs ORM (Object-Relational Mapping)
  • Komponenten und Helfer

Konvention über Konfiguration

Bei CakePHP ging es schon immer um schnelle und konsistente Entwicklung, und zu diesem Zweck legt CakePHP großen Wert auf Konventionen. Daher hält sich CakePHP wie Ruby on Rails (von dem CakePHP einen Großteil seiner Inspiration bezog) stark an das Prinzip der Konvention über die Konfiguration.

Konventionen bedeuten, dass ein Entwickler nicht darüber nachdenken muss, „wohin die Dinge gehen“, wenn er lernt, wie man das CakePHP-Framework verwendet, da Standardwerte für diese Regeln bereits vorhanden sind. Während man sich mit den CakePHP-Konventionen vertraut machen muss, kann sich der Entwickler, sobald er sie beherrscht, auf die Kernentwicklung konzentrieren, anstatt sich Gedanken über die Platzierung des Codes und andere Konfigurationsprobleme machen zu müssen.

Die Konventionen von CakePHP stehen in krassem Gegensatz zu PHP selbst, einer ziemlich liberalen Sprache. Aufgrund seiner Konventionen trägt CakePHP dazu bei, mehr Konsistenz im Codierungsstil und in der Struktur über mehrere Entwickler und sogar über mehrere Teams hinweg sicherzustellen. Durch die Annahme einer Reihe von Standardkonventionen strebt Cake danach, die Entwicklung konsistenter zu gestalten.

Für ein Datenbankschema trifft CakePHP beispielsweise bestimmte Standardannahmen hinsichtlich der Benennung bestimmter Variablen, Tabellennamen und Felder. Konkret erwartet Cake, dass:

  • Tabellennamen stehen im Plural (z. B. orders )
  • Der Name des Primärschlüsselfeldes ist id
  • Die Namen aller Fremdschlüsselfelder basieren auf dem referenzierten Tabellennamen gefolgt von _id (z. B. würde der Fremdschlüssel in eine customers customer_id heißen).

Betrachten wir zur Veranschaulichung eine einfache Überprüfung von zwei Tabellen ( articles und users ) aus einer Blogpost-Datenbank. In unserem Beispiel sagen wir, dass ein Articles „BelongsTo“ ein Users und ein Users „HasMany“ Articles sind. Diese Beziehungen würden in CakePHP 3.0 wie folgt spezifiziert:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }

CakePHP geht von den Standardkonventionen aus und weiß dadurch automatisch, nach welchen Fremdschlüsseln ( user_id in der articles ) gesucht werden muss, wenn Assoziationen abgerufen werden.

Es ist jedoch wichtig zu betonen, dass CakePHP 3 es ermöglicht, dass seine Standardkonventionen leicht außer Kraft gesetzt werden. Nehmen wir zum Beispiel an, unser Fremdschlüssel in der users hieß author_id statt user_id . Um dies anzugeben, wären nur die folgenden zwei kleinen Änderungen an unserem Code erforderlich, um CakePHP mitzuteilen, dass wir nicht die Standardeinstellung verwenden:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }

Obwohl Konventionen in CakePHP in der Tat integral sind und definitiv ihre Vorteile haben, ist es wirklich ganz einfach, sie bei Bedarf zu überschreiben, wie wir hier gezeigt haben.

Während einige Entwickler PHP-Frameworks (wie Yii und Laravel) bevorzugen, die nicht so stark auf Konventionen angewiesen sind, können CakePHP-Konventionen tatsächlich sehr vorteilhaft sein. Sie können dazu beitragen, die Anlaufzeit für einen CakePHP-Entwickler drastisch zu verkürzen, wenn er mit der Verbesserung oder Wartung von Code beauftragt wird, der von einem anderen Entwickler geschrieben wurde, da sie zu einer konsistenten Codierungsstruktur und Konventionen über mehrere CakePHP-Entwickler und -Projekte hinweg führen.

Objektrelationales Mapping (ORM) von CakePHP

Das objektrelationale Mapping (ORM) von CakePHP profitiert stark von den Framework-Konventionen von CakePHP. Indem Sie das Datenbankschema den Standards von Cake anpassen, können Sie Tabellen schnell über das leistungsstarke ORM von Cake miteinander verbinden. Sie müssen selten eine SQL-Anweisung schreiben, da CakePHP Dinge wie Tabellenverknüpfungen, hasMany und sogar hasAndBelongsToMany Beziehungen problemlos handhabt.

Mithilfe von ContainableBehavior können Sie über Ihre Modellzuordnungen angeben, welche Datenbanktabellen und -felder aus einer SQL-Abfrage ausgewählt werden sollen. Dies kann mehrere Tabellen tief gehen, und durch das ORM ist es einfach, hochkomplexe SQL-Anweisungen schnell zu erstellen.

ContainableBehavior von CakePHP ist übrigens ein großartiges Beispiel dafür, wie CakePHP die PHP-Entwicklung vereinfachen und rationalisieren kann. Es hilft Ihnen, Daten auf saubere und konsistente Weise zu suchen und zu filtern und kann auch dazu beitragen, die Geschwindigkeit und Gesamtleistung Ihrer Anwendung zu steigern. (Es funktioniert, indem die Zuordnungen Ihrer Modelle vorübergehend oder dauerhaft geändert werden, indem die bereitgestellten Containments verwendet werden, um eine entsprechende Reihe von bindModel und unbindModel Aufrufen zu generieren.)

Die Herausforderung beim ORM besteht darin, dass es die Verwendung von SQL so einfach macht, dass ein Entwickler, wenn er nicht aufpasst, unbeabsichtigt ineffiziente SQL-Abfragen schreiben kann. Ich habe sicherlich viele Male schlecht geschriebene Cake-Anwendungen gesehen, die ihre Abfragen nicht optimiert haben. Diese Probleme treten in der Regel einige Jahre nach der Bereitstellung eines Systems auf, wenn Datenbanken größer werden und schlecht geschriebene Abfragen immer langsamer werden.

Das Hauptproblem hierbei ist, dass vor der neuesten CakePHP-Version 3 das ORM von Cake standardmäßig alle zugehörigen Tabellen abrufen würde, wenn eine Abfrage durchgeführt wird. Infolgedessen könnte eine einfache „Find All“-Abfrage möglicherweise ziemlich aufgebläht werden, da das zugrunde liegende SQL alle Daten aus allen zugehörigen Tabellen abrufen würde. In Version 3 ist dieses Verhalten nicht mehr der Standard. (Und in früheren Versionen von CakePHP lässt sich dieses Standardverhalten einfach deaktivieren, indem einfach public $recursive = -1; zu Ihrer Hauptdatei AppModel.php wird.)

Insgesamt zeigt eine Überprüfung des ORM von Cake, dass es wirklich hilft, die Entwicklung zu rationalisieren, und bei richtiger Verwendung ein erstaunliches Tool zum schnellen Erstellen komplexer Abfragen ist. Dennoch ist es wichtig, dass sich Entwickler die Zeit nehmen, das ORM vollständig zu verstehen und sicherzustellen, dass ihre Abfragen richtig optimiert sind (wie es in jeder Sprache der Fall ist).

Komponenten und Helfer: CakePHP-Bibliotheken

Eines der großartigen Features von CakePHP sind die eingebauten Bibliotheken – Komponenten und Helfer – die viele langweilige, sich wiederholende und ermüdende Entwicklungsaufgaben beseitigen. Im MVC-Kontext helfen Komponenten dabei, die Entwicklung von Controllern zu rationalisieren, während Helfer die Codierung und Logik der Ansicht (dh die Präsentationsschicht) vereinfachen.

Die PaginatorComponent zum Beispiel automatisch eine Nächste/Vorherige-Seite-Schnittstelle aus einer Suchabfrage. Fügen Sie den JsHelper , und plötzlich haben Sie AJAX Pagination, unterstützt von Ihrem bevorzugten JavaScript-Framework (standardmäßig jQuery).

Eine kurze Auswahl weiterer nützlicher Helfer umfasst:

  • TimeHelper : Macht das Anzeigen von Datum und Uhrzeit zum Kinderspiel und bietet eine Reihe von Funktionen zum Formatieren und Auswerten von Zeitwerten.
  • NumberHelper : Bietet praktische Methoden zum Anzeigen von Zahlen in einer Vielzahl gängiger (oder angepasster) Formate und Genauigkeiten.
  • TextHelper : Hilft beim Aktivieren von Links, beim Formatieren von URLs, beim Erstellen von Textauszügen um ausgewählte Wörter oder Phrasen herum, beim Hervorheben von Schlüsselwörtern in Textblöcken und beim eleganten Abschneiden langer Textabschnitte.

Und es gibt noch viele mehr.

Kritik an CakePHP 3

Natürlich hat jedes Framework seine Vor- und Nachteile, und CakePHP ist da keine Ausnahme. Hier sind einige der häufigsten Kritikpunkte, die außerhalb dieser Rezension an CakePHP geäußert werden:

  • „Legacy-Framework; aufgebläht und langsam.“ Diese Kritik ist in der Regel eher historischer Natur und hat heute (wenn überhaupt) nur eine begrenzte Wahrheit. Die Unterstützung von PHP-Versionen bis hin zu PHP 4 hat in der Vergangenheit dazu geführt, dass CakePHP viele von PHPs eigenen Legacy-Problemen lösen musste. Mit der Reife von PHP und insbesondere mit der Veröffentlichung von CakePHP Version 3 hat diese Behauptung wirklich ihre Gültigkeit verloren.

  • „Übermäßig streng und einschränkend.“ Während die CakePHP-Konventionen klare Vorteile haben, gibt es dennoch diejenigen, die sie kritisieren. Kritiker argumentieren oft, dass die Konventionen zu streng seien, aber sie erkennen (oder erkennen) nicht an, dass diese Konventionen leicht außer Kraft gesetzt werden können. Durch die Übernahme einer Reihe von Standardkonventionen versucht Cake, die Entwicklung konsistent zu machen, was angesichts der ansonsten lockeren Codierungspraktiken von PHP nur als positive Sache angesehen werden sollte.

  • „Langsamer Release-Zyklus“. Ein langsamer Release-Zyklus ist nicht unbedingt schlecht. Im Gegenteil, ein zu aggressiver Release-Zyklus kann tatsächlich problematischer sein. Tatsächlich ist ein Teil des Grundes, warum Hauptversionen von CakePHP Zeit brauchen, die Gewährleistung der Abwärtskompatibilität mit früheren PHP-Versionen, die immer noch weit verbreitet sind. Darüber hinaus eliminieren dieser konservative Veröffentlichungszyklus und die Betonung der Abwärtskompatibilität die Notwendigkeit größerer (und häufiger) Änderungen an Ihrem Code, wenn neue Versionen veröffentlicht werden. Anzumerken ist auch, dass das Team von CakePHP 3 alles andere als langsam ist, wenn es um Minor Releases (Bugfixes, Patches, kleinere Erweiterungen etc.) geht, die monatlich erscheinen . Ebenso werden die meisten Fehlertickets innerhalb von Stunden nach der Veröffentlichung beantwortet.

  • „Keine Out-of-the-Box-Lösung.“ Im Gegensatz zu vielen anderen modernen „Web-App-Out-of-the-Box“-PHP-Frameworks (wie zum Beispiel Yii) sucht CakePHP gezielt nach der Unterstützung und Ermöglichung benutzerdefinierter Lösungen. Ich persönlich habe davon bei der Entwicklung einer Reihe von großen, benutzerdefinierten, datenbankgestützten Websites und Anwendungen stark profitiert.

  • „Verwendet Datenarrays statt Objekte.“ Dies gilt ab Version 3 nicht mehr. In früheren Versionen mussten alle Daten als verschachtelte Arrays gespeichert und referenziert werden (z. B. $user['User']['username'] ). CakePHP 3 adressiert dies schließlich und speichert Daten stattdessen als Objekte (zB $user->username ).

  • „Schlechte Dokumentation.“ Diese Kritik hat einige Berechtigung, da die CakePHP-Dokumentation nicht immer für Anfänger geschrieben zu sein scheint (wichtige Informationen werden manchmal in nur ein oder zwei Sätzen behandelt, während ein paar Absätze der Diskussion wahrscheinlich gerechtfertigt gewesen wären ). Das Cake-Entwicklungsteam ist sich dessen bewusst und arbeitet daran, die Dokumentation entsprechend zu verbessern. Tatsächlich weist die Homepage der CakePHP 3-Dokumentation ausdrücklich auf ein hohes Maß an Engagement für die „Qualität, Gültigkeit und Genauigkeit“ der Dokumentation hin. Da CakePHP ein von der Community betriebenes Framework ist, wird auf jeder Seite der Dokumentation eine Schaltfläche „Dieses Dokument verbessern“ bereitgestellt, die es CakePHP-Benutzern ermöglicht und ermutigt, ihre eigenen Ergänzungen, Löschungen oder Korrekturen zur Dokumentation beizutragen.

Fazit

Alles in allem zeigt eine Überprüfung von CakePHP fast 10 Jahre nach seiner ersten Veröffentlichung, dass es ein lebendiger und beeindruckender Konkurrent für die vielen anderen PHP-Frameworks bleibt, die seitdem entstanden sind.

CakePHP ist eine vollständige und umfassende Entwicklungslösung. Die Codebasis ist ausgereift und die Funktionalität scheint endlos. Insgesamt wurde Cake für eine schnelle Entwicklung entwickelt, was nicht nur für Softwareentwickler, sondern auch für Investoren wichtig ist. Die größten Kosten bei der Softwareentwicklung sind die Kosten für die Entwicklungszeit, und CakePHP zielt darauf ab, die Entwicklungszeit erheblich zu verkürzen.

CakePHP ist ein von der Community betriebenes Projekt. Es kann nur besser werden, wenn immer mehr Menschen mitmachen. Ich bin seit 7 Jahren dabei und habe gesehen, wie die Community weiter wächst, und ich freue mich auf diese nächste Stufe für CakePHP. Die Einführung von CakePHP 3 und die Reife von PHP und CakePHP bedeutet, dass das Framework immer besser und besser wird.

Wenn Sie nach einer PHP-basierten Lösung suchen, die viele ähnliche Vorteile wie Ruby on Rails bietet (in Bezug auf Benutzerfreundlichkeit und Konvention gegenüber Konfiguration), dann probieren Sie CakePHP aus. Das CakePHP-Blog-Tutorial dauert jedoch nur wenige Minuten, um eingerichtet und ausgeführt zu werden, oder alternativ bietet CakeCoded eine Reihe klarer Lektionen, um einen PHP-Entwickler mit CakePHP vertraut zu machen und mit der Verwendung zu beginnen. Mit diesen Ressourcen werden Sie schnell erkennen, inwieweit CakePHP Ihre PHP-Softwareentwicklungsbemühungen beschleunigen und verbessern kann. Genießen!


Michael Houghton ist ein in Irland ansässiger Toptal-Ingenieur mit umfassender CakePHP-Erfahrung. Er hat über 100 Websites mit dem Framework entwickelt, mit dem Team von CakeDC (dem kommerziellen Unternehmen hinter dem CakePHP-Framework) zusammengearbeitet, verschiedene Patches eingereicht und bei der CakePHP-Dokumentation geholfen.