PHP-Frameworks im Test (3)

3. Details

Im vorliegenden Kapitel soll nun jeder Kandidat auf Herz und Nieren getestet werden. Dazu wird jedem Framework ein eigenes Kapitel gewidmet in dem die unter Kapitel 1 beschriebenen Bewertungen überprüft werden. Kapitel 3 soll jedoch, wie erwähnt, auch als Nachschlage-Werk für Lösungen und Code-Beispiele genutzt werden können. Im Anschluss an jede Seite finden Sie die Möglichkeit, die Inhalte zu kommentieren. Die Quellcodes, die während der Evaluierung entstanden sind, können unter den in Kapitel 5 aufgeführten Links heruntergeladen werden.


3.1. CakePHP


3.1.1. Allgemeines

Roadmap des Projekts
Unter https://trac.cakephp.org/roadmap kann die Roadmap des Projektes bis Milestone 2.0.0.x eingesehen werden. Darüber hinaus ist im Trac eine Timeline mit den aktuelle eingepflegten Änderungen / Bugfixes und Features einzusehen. Der Besucher / Entwickler erhält somit einen umfassenden Eindruck über die Aktivitäten und kann das Trac zusätzlich als Knowledge-Database bei Problemen zu Rate ziehen.


Aktualität der Version
Die unter http://cakeforge.org/frs/?grou...ase_id=294 verfügbare Version stammt vom 09.07.2007 03:10. Das Release-Datum und die vorhergehenden Ausführungen stellen sicher, dass der Code aktuell ist und das Projekt regelmäßig gepflegt wird.


Release-Packages in verschiedenen Formaten
Die angebotenen Release-Packages sind in den Paket-Versionen ZIP, GZ und BZ2 verfügbar. Somit ist sichergestellt, dass die Pakete auch auf Nicht-Windows-Betriebssystemen einfach verwendet werden können.


CVS/SVN-Repositories
Für CakePHP ist ein öffentliches SVN-Repository zugänglich, über das z.B. "nightly builds" bezogen werden können. Unter https://trac.cakephp.org/wiki sind die dafür nötigen SVN-Kommandos aufgeführt. Hiermit ist es dem Entwickler möglich schnell und einfach Bugfixes zu beziehen.


Bug-Tracking / Ticketing
Unter https://trac.cakephp.org/wiki/bugreport können Bugs über Trac berichtet werden. Diese werden direkt in die Ticket-Queue übertragen, um sicher zu stellen, dass die gemeldeten Bugs schnell gefixt werden.


Version für PHP 4
Die installierte Version ist zu PHP 4 (im Test: Version 4.4.6) kompatibel.


Version für PHP 5
Die installierte Version ist zu PHP 5 (im Test: Version 5.2.1) kompatibel.


3.1.2. Installation

Extract & Go
Die Installation gestaltet sich bei CakePHP sehr einfach. Das heruntergeladene Archiv muss lediglich in den Bereich des Document-Roots des Webservers entpackt werden. Nach dem Extrahieren kann die mitgelieferte Beispielseite per Browser aufgerufen werden. Im Test wurde für CakePHP eine eigene VHOST-Konfiguration angelegt um eigene Log- und Error-Dateien zu haben, was für die Funktion jedoch nicht relevant ist.


Konfiguration
Es ist zunächst keine nachträgliche Konfiguration des Packages notwenig, es ist ohne diese lauffähig.


3.1.3. Erste Schritte

Demo-Software
Im Lieferumfang des CakePHP-Frameworks ist eine Demo-Seite enthalten, die die Konfiguration prüft, auf wichtige Stellen im Manual hinweist, Möglichkeiten der Gestaltung der aktuell aufgerufenen Seite aufzeigt und Internet-Ressourcen zu CakePHP auflistet.
Die Demo-Seite enthält Hinweise auf die zu ändernden Dateien und macht es dem Benutzer somit sehr leicht erste Änderungen einzupflegen und sich mit der Software zurecht zu finden. Die Seite beinhaltet jedoch keine Demo-Module, die ein Gefühl für die Funktionsweise der Software geben.


Einführung / Quickstart
Unter http://manual.cakephp.org/chapter/intro findet der Einsteiger eine Übersicht über die Features des CakePHP-Frameworks. Die Ausführungen auf http://manual.cakephp.org/chapter/basic_concepts führen den Entwickler in die Struktur der Code-Dateien und deren Bedeutung ein. Eine erweiterte Anleitung zur Installation, insbesondere zur Einrichtung des "mod_rewrite"-Moduls des Apache Webservers, kann unter http://manual.cakephp.org/chapter/installing nachgeschlagen werden.


3.1.4. Erstellung einer Webseite

Template-Bau / Layoutgestaltung
Wie bereits erwähnt wartet das Framework mit sehr aussagekräftigen Benutzer-Meldungen auf, die zur schnellen Einarbeitung und zum guten Verständnis von Fehler beitragen. Es kostet relativ wenig Mühe ein eigenes Layout auf die Standard-Seite zu legen. Hierzu muss lediglich die Datei /app/views/layouts/default.thtml angelegt und mit einem
PHP-Code
echo $content_for_layout;
an der Stelle gefüllt werden, die für die Ausgabe des Inhaltes bestimmt ist. Interessant wird nun der Nachbau der in den Anforderungen beschrieben Seite.

Zunächst wird - um Arbeit zu sparen - das Haupt-Layout der Seite in die Datei default.thtml kopiert und die Startseite aufgerufen. PHP meldet daraufhin einen Fehler bei der Verarbeitung des Strings
APF-Template
<?xml version="1.0" encoding="iso-8859-1" ?>
Wie sich herausstellt, werden die CakePHP-Templates als PHP-Code ausgeführt und die PHP- Konfiguration enthielt ein
APF-Template
short_open_tag = On
Setzt man diese Direktive in der php.ini auf "Off", wird das Template sauber verarbeitet. Allerdings ist es somit natürlich nicht mehr möglich, innerhalb des Templates mit ShortTags zu arbeiten. Bevorzugt man für das Einfügen von PHPCode die Möglichkeit, dies weiterhin mit
APF-Template
<?=$variable?>
zu lösen, müssen ShortTags wieder aktiviert und das XML-Tag als
APF-Template
<?='<?xml version="1.0" encoding="iso-8859-1" ?>'."\n"?>
im Template angepasst werden. Diese Tatsache gilt ebenso für die Probanden CodeIgniter und Zend Framework.

Der mit dem Package ausgelieferte Beispiel-Controller (PagesController unter /cake/libs/controller) bietet die Möglichkeit Inhalts-Dateien, die unter /apps/views/pages abgelegt sind per URL-Parameter auszugeben. Legt der Entwickler eine Datei mit dem Namen startseite.thtml an, so kann diese per http://caketest.de/pages/startseite aufgerufen werden und ist im oben erstellten Layout eingebettet (http://caketest.de ist die lokale URL des VHOSTs, der für den Test konfiguriert wurde). Um diese Funktion sicherstellen zu können muss allerdings der PagesController um jeweils eine der Seite gleichnamige Action-Methode ergänzt werden. Diese trägt gemäß Konvention den Namen {DateiNameOhneEndung}. Bei "Startseite" ist das dann Startseite().

Da das URL-Layout des Frameworks standardmäßig die Form
APF-Template
http://my.domain.tld/{Controller}/{Action}[/{Value1}/{Value2}/...]
erwartet, muss, um dasselbe URL-Layout wie in der vorliegenden Webseite generieren zu können, ein neuer Controller mit dem Namen SeiteController angelegt werden. Diese kann im einfachsten Fall von PagesController erben, oder selbst implementiert werden. Der Einfachheit wegen sei hier nur die Variante 1 gezeigt:
PHP-Code
require_once('../../cake/libs/controller/pages_controller.php'); class SeiteController extends PagesController { /** * Name des Ordners in dem die View-Templates abgelegt werden. */ private $name = 'demosite'; /** * Bekanntmachen der Helper */ private $helpers = array( 'HTML', 'RepeaterWidget', 'HighlightWidget', 'PHPHighlightWidget', 'DokuNavigation', 'FileHighlight' ); /** * null = keine Models werden verwendet */ private $uses = null; }
Im Beispiel sind bereits später vorgenommene Änderungen enthalten. Zu einen wurde der Ablage-Ort für die Template Dateien durch Setzen des Attributes $name in den Ordner /apps/views/demosite verschoben, zum anderen werden hier bereits ViewHelper geladen, die zur Ausgabeformatierung benötigt werden. Da hier lediglich Inhalt von Seiten ausgegeben wird, teilt der Entwickler mit
PHP-Code
private $uses = null;
mit, dass dieser Controller kein Model benötigt.


Handling von Controllern
Der nächste notwenige Schritt ist die Anpassung der URL-Routings. Dies kann in der Datei /apps/config/routes.php erledigt werden. Dazu wurden drei weitere Einträge hinzugefügt, die bewirken, dass bei Aufruf der URLs
APF-Template
http://caketest.de http://caketest.de/Seite http://caketest.de/Seite/Startseite
der jeweils korrekte Controller und die gewünschte ActionMenthode aufgerufen wird und die Ausgabe generiert. Diese sind:
PHP-Code
$Route->connect('/', array('controller' => 'Seite', 'action' => 'display')); $Route->connect('/Seite', array('controller' => 'Seite', 'action' => 'display')); $Route->connect('/Seite/*', array('controller' => 'Seite', 'action' => 'display'));
Anschließend werden beispielhaft einige Content-Dateien der Vorlage-Seite nach dem oben beschriebenen Muster im Ordner /apps/views/demosite angelegt. Ausgewählt wurden hier u.a.
Erweiterbarkeit der GUI-Komponenten
Die unter "Handling von Controllern" genannten Seiten beinhalten neben reinem HTML-Text auch XML-Tags, die den Inhalt formatiert ausgeben. Wie auf der Benchmark-Seite zu sehen ist, werden dort PHP-Code-Snippets gehighlighted angezeigt. Generiert werden diese formatierten Code-Fragmente von einer Taglib, die unter http://adventure-php-framework...sErstellen in Kapitel 2.1 beschrieben ist.
Für diese Aufgabe wartet CakePHP mit den ViewHelpern auf, die beliebig erweitert werden können. Hier ist jedoch nicht das Verarbeiten von XML-Tags vorgesehen. Nach einer Recherche zu diesem Thema im Manual und den angeschlossenen Resourcen wurde der Autor unter http://rossoft.wordpress.com/2...gethelper/ fündig. Hier wurde auf Basis der ViewHelper ein WidgetHelper implementiert, der generisch XML-Tags parsen kann. Erweitert man diesen, kann man seinen eigenen WidgetHelper implementieren, der beliebige Formatierungsaufgaben an Hand von XML-Tags vornehmen kann. Dazu bindet der Entwickler den WidgetHelper ein und erweitert diesen um die gewünschte Funktionalität. Um beim Beispiel PHP-Code-Highlighting zu bleiben gestaltet sich die Implementierung wie folgt:
PHP-Code
require_once(dirname(__FILE__) . DS . 'widget_helper.php'); class PHPHighlightWidgetHelper extends WidgetHelper { /** * Tag definieren. */ private $tag = array('php:highlight'); /** * Tag-Parser-Methode der Form "tag_{prefix}_{class}". */ public function tag_php_highlight($attr,$inner_html){ // Zeilenumbrüche entfernen $HighlightedContent = highlight_string( trim('<?php'.ltrim(rtrim($inner_html),"\x0A..\x0D").' ?>'), true ); // PHP-Anfangstag ersetzen $HighlightedContent = str_replace('< font color="#007700"><?< /font>', '', $HighlightedContent); $HighlightedContent = str_replace('< font color="#0000BB"><?php ', '< font color="#0000BB">', $HighlightedContent); $HighlightedContent = str_replace('< font color="#0000BB">php', '< font color="#0000BB">', $HighlightedContent); $HighlightedContent = str_replace('< font color="#0000BB"> < /font>', '', $HighlightedContent); // PHP-Endtag ersetzen $HighlightedContent = str_replace('< font color="#0000BB">?>< /font>','',$HighlightedContent); // Code im DIV zurückgeben return '< div class="phpcode">'.$HighlightedContent.'< /div>'; } }
Nach diesem Schema können nun auch die übrigen XML-Tag-Funktionalitäten wie
  • <file:highlight />
  • <doku:navigation />
nachgebaut werden.


Komplexe Layouts
Problematisch ist das Bauen von beliebig tief verschachtelten Templates, was bei der Einbindung weiterer dynamischer Bereiche in die Seite zeigt. Statische Bereiche wie wie Menü und Top-Menü hingegen können über Elements eingebunden werden, die jedoch nur statischen HTML-Code erzeugen können. Eine Art "Controller für Elements", mit dem weiterer dynamischer HTML-Code generiert werden kann - um beispielsweise ein Menü aus einem Model-Objekt darzustellen - ist nicht vorgesehen. Konkret wurde das Menü, das Top-Menü und der News-Bereich in drei eigenständige Elemente ausgelagert und unter /apps/views/elements abgelegt. Im Layout kann nun per
PHP-Code
echo $this->renderElement('menu');
das Menü eingebunden werden. Gleiches gilt für Top-Menü und News-Bereich.

Eine Möglichkeit der Auslagerung stellen die so genannten Components dar. Eine detaillierts Beschreibung ist unter http://manual.cakephp.org/chapter/components zu finden. Mit Hilfe dieser Methodik kann die Logik des Menüs aus dem Controller ausgelagert werden und der Controller muss sich primär nur um seine Aufgabe kümmern.
Hier wurde jedoch keine weitere Prüfung unternommen, da keine Beschreibungen für eine offizielle Lösung unter den CakePHP-Seiten gefunden werden konnte. Ansätze waren unter zu finden.


FormularDesign
Ein sehr häufig wiederkehrendes Thema ist Formular-Design. Darunter fällt das Erstellen und Verarbeiten eines Formulars. Dazu bietet CakePHP die HTML- bzw. Form-Helper an. Eine detaillierte Beschreibung findet sich unter http://manual.cakephp.org/chapter/helpers. Zu Evaluierungszwecken wurde versucht das in den Anforderungen beschriebene Kontaktformular nachzubauen. Um das Formular in die bereits bestehende Seite einzubinden wird ein neues View-Template mit dem Namen formular_test.html unter /apps/views/demosite angelegt. Dies hat folgenden Inhalt:
APF-Template
<font style="font-size: 26px; font-weight: bold;">Kontakt-Formular</font> <br /> <br /> Wenn Sie mit mir in Kontakt treten möchten, dann benutzen Sie einfach dieses Formular. Geben Sie Ihre Nachricht ein und schon kann es los gehen. Ich werden mich dann umgehend mit Ihnen in Verbindung setzten. <strong>Bitte füllen Sie das Formular vollständig aus!</strong>. <br /> <br /> <?php echo $html->formTag('/Seite/FormularTest'); ?> <span style="width: 47px; border: 0px solid black; margin-right: 69px;">Person:</span> <?php echo $html->selectTag('Contact/person', array( '1' => 'Max Mustermann', '2' => 'Bianka Mustermann' ), null, array( 'class' => 'eingabe_feld' ) ); ?> <br /> <br /> <span style="width: 56x; border: 0px solid black; margin-right: 64px;">Ihr Name:</span> <?php echo $html->input('Contact/name', array( 'class' => 'eingabe_feld', 'style' => 'width: 280px;'.$ContactNameStyle ) ); ?> <?php echo $ContactNameErrorMessage; ?> <br /> <br /> <span style="width: 108px; border: 0px solid black; margin-right: 10px;">Ihre eMail-Adresse:</span> <?php echo $html->input('Contact/email', array( 'class' => 'eingabe_feld', 'style' => 'width: 280px;'.$ContactEMailStyle ) ); ?> <?php echo $ContactEMailErrorMessage; ?> <br /> <br /> <span style="width: 57px; border: 0px solid black; margin-right: 61px;">Ihr Betreff:</span> <?php echo $html->input('Contact/subject', array( 'class' => 'eingabe_feld', 'style' => 'width: 280px;'.$ContactSubjectStyle ) ); ?> <?php echo $ContactSubjectErrorMessage; ?> <br /> <br /> Ihre Nachricht: <br /> <?php echo $html->textarea('Contact/note', array( 'class' => 'eingabe_feld', 'style' => 'height: 200px; width: 400px; overflow: auto;' ) ); ?> <?php echo $html->tagErrorMsg('Contact/note', 'Note is required.'); ?> <br /> <br /> <?php echo $html->submit('Absenden',array('class' => 'eingabe_feld')); ?> </form>
Das Template zeigt, dass der Entwickler oder Template-Bauer mit dem HTML-Helper die Möglichkeit hat Formular-Felder per Helper-Funktionen generieren zu lassen. Hier stehen ihm beispielsweise die Methoden input() oder textarea() für die Erstellung von ein- und mehrzeiligen Eingabefeldern sowie formTag() zur Ausgabe eines Formural-Anfangs- Tags zur Verfügung. Die Unterstützung zur Generierung von Multi-Select-Feldern ist nicht vorgesehen, es ist für alle generierbaren Felder jedoch eine automatische Befüllung nach dem GET-/POST-Request implementiert, was dem Template-Bauer bereits einige Arbeit abnimmt.

Wie bereits erwähnt, soll das Formular mit einer Feld-Validierung ausgestattet werden, für die CakePHP leider out-of-the-box keine Helper-Tools bietet. Um das zu erreichen wurde der Controller um die Methode FormularTest() erweitert. Da die Methode auf Grund des oben beschriebenen Routing-Eintrags nicht aufgerufen wird, muss das Routing wie folgt geändert werden:
PHP-Code
$Route->connect('/Seite', array('controller' => 'Seite', 'action' => 'Startseite','StartSeite')); $Route->connect('/Seite/FormularTest', array('controller' => 'Seite', 'action' => 'FormularTest')); $Route->connect('/Seite/*', array('controller' => 'Seite', 'action' => 'display'));
Hier muss die "spezielle" Action vor der allgemeinen stehen, da sonst die allgemeine Route vor der speziellen gefunden wird.

Wie der obige Quellcode auch zeigt, wurde im Controller die set()-Methode verwendet um zusätzliche Stile über View-Attribute an die Eingabe-Elemente zu hängen. Diese können dann bei erfolgter Validierung entsprechend gesetzt werden. Die Ausgabe der Fehlermeldung wurde ebenso gelöst. Die unter http://manual.cakephp.org/chapter/validation beschriebenen Validations-Möglichkeiten helfen bei der Prüfung der Benutzer-Eingaben nur bedingt, da die auf der Seite beschriebenen nur das Model betreffen, nicht die Formular-Eingaben, die ohne Einbezug eines Model-Objekts verarbeitet werden.

Der im nächsten Kasten gezeigte Teil des Controllers kann dafür eine Lösung darstellen:
PHP-Code
public function FormularTest(){ // Ist Formular abgeschickt worden? if(!empty($this->data['Contact'])){ // Merker für die Validierung setzen $valid = true; // Validierung Name if(isset($this->data['Contact']['name']) && strlen($this->data['Contact']['name']) > 3){ $this->set('ContactNameStyle',''); $this->set('ContactNameErrorMessage',''); } else{ $this->set('ContactNameErrorMessage',' Bitte geben Sie einen Namen an!'); $this->set('ContactNameStyle',' border: 2px solid red;'); $valid = false; } // Validierung Betreff if(isset($this->data['Contact']['subject']) && strlen($this->data['Contact']['subject']) > 3){ $this->set('ContactSubjectStyle',''); $this->set('ContactSubjectErrorMessage',''); } else{ $this->set('ContactSubjectStyle',' border: 2px solid red;'); $this->set('ContactSubjectErrorMessage',' Bitte geben Sie ein Betreff an!'); $valid = false; } // Validierung E-Mail if( isset($this->data['Contact']['email']) && ereg("^([a-zA-Z0-9\.\_\-]+)@([a-zA-Z0-9\.\-]+\.[A-Za-z][A-Za-z]+)$",$this->data['Contact']['email']) && strlen($this->data['Contact']['email']) > 3 ){ $this->set('ContactEMailStyle',''); $this->set('ContactEMailErrorMessage',''); } else{ $this->set('ContactEMailStyle',' border: 2px solid red;'); $this->set('ContactEMailErrorMessage',' Bitte geben sie eine korrekte E-Mail-Adresse an!'); $valid = false; } // Falls Formular valide ist, abschicken if($valid == true){ // E-Mail versenden $this->redirect('/Seite/FormularDanke'); } } else{ // Standard-Werte setzen, da sonst Fehler mit undefined variable geworfen werden $this->set('ContactNameStyle',''); $this->set('ContactEMailStyle',''); $this->set('ContactSubjectStyle',''); $this->set('ContactNoteStyle',''); $this->set('ContactNameErrorMessage',''); $this->set('ContactEMailErrorMessage',''); $this->set('ContactSubjectErrorMessage',''); } }
Fazit ist, dass die Validierung eines Formulars weitestgehend selbst erstellt werden muss, dem Entwickler aber bereits einige Aufgaben im Formular-Handling abgenommen werden. Insbesondere das Speichern von Model-Objekten wird sehr einfach ermöglicht.



3.1.5. URL-Handling

Unterstützung von URL-Rewriting
URL-Rewriting wird von CakePHP nativ unterstützt. Hierzu bringt das Release-Package die entsprechenden Apache-RewriteRules mit, die alle Anfragen auf die zentrale Bootstrap-Datei index.php weiterleiten. Die dafür vorgesehenen Programmteile extrahieren die Controller-Anweisungen aus der Request-Variable url. Ein Betrieb ohne URL-Rewriting konnte nach etwas Suchen in einem Appendix des Tutorials (http://manual.cakephp.org/appendix/blog_tutorial, Sektion 6) gefunden werden. Dort wird beschrieben, dass in der Datei /app/config/core.php die Zeile
PHP-Code
define ('BASE_URL', env('SCRIPT_NAME'));
auskommentiert und alle (!) .htaccess-Dateien im Release-Package gelöscht werden. Darüber hinaus muss die VHOST-Konfiguration so angepasst werden, dass der DocumentRoot auf das Verzeichnis /app/webroot zeigt.

Generik des URL-Layouts
Das URL-Layout hat zur Zeit der Auslieferung das Format
APF-Template
http://www.example.com/{Controller}/{Action}[/{Param1}/.../{ParamN}]
Über die Routing-Einträge können unterschiedliche URL-Teile als Kenner für bestimmte Aktionen verwendet werden. Das Aufbrechen des URL-Layouts hinsichtlich der Ausführung mehrerer Controller zur Laufzeit ist jedoch nicht möglich.


URL-Manipulations-Tools / Linkgenerierung
Zur Generierung von URLs steht der HTML-Helper zur Verfügung. Die Methoden link(), linkEmail() und url() sind jedoch nur zur vereinfachten Ausgabe gedacht, nicht zur Manipulation einer URL. Siehe hierzu auch http://api.cakephp.org/class_html_helper.html.



3.1.6. Design des Frameworks

Umfang der mitgelieferten Komponenten
CakePHP wird mit einer Vielzahl von Komponenten ausgeliefert. Dies sind Core-Libraries im Ordner /cake und Beispiel-Dateien unter /apps. Zudem gibt es zahlreiche Plugins und Erweiterungen, die unter http://cakeforge.org. Die Bakery unter http://bakery.cakephp.org umfasst viele Artikel und HOWTOs, denen Funktionen und weitere Komponenten entnommen werden können.
Ein weitere Punkt sind Komponenten wie ACL und Plugins, die es ermöglichen Anwendungen dynamisch und je nach Anforderung zu erweitern. Informationen hierzu finden sich im Manual unter http://manual.cakephp.org/chapter/acl und http://manual.cakephp.org/chapter/plugins. Es sei jedoch darauf hingewießen, dass das hier angesprochene ACL-Package nicht die Aufgabe der Benutzer-Authentifikation übernimmt, sondern lediglich Zugriffsrechte von Objekten auf Objekte regelt. Ersteres muss nach wie vor selbst implementiert werden.


Einsatz von Design-Pattern
Die Entwickler von CakePHP setzen auf objektorientierte Programmierung sowohl in PHP 4 als auch in PHP 5. Als eines der herausragenden Pattern wird das Model-View-Controller-Pattern (MVC) betrachtet, um das die Core-Klassen designed sind. Bei der Request-Verarbeitung setzt CakePHP auf einen Application-Controller, der einem Front-Controller ähnlich ist.
Ganzheitlich betrachtet existiert ein durchgängiges Objektmodell, bei dem alle Klassen auf einer Basis-Klasse (Object) aufsetzen. Diese behandelt grundlegende Themen und ahmt das Konstrukor- / Destruktor-Verhalten von PHP 5 in PHP 4 nach. Global betrachtet kann daher von einem guten Software-Design nach anerkannten Design-Pattern gesprochen werden. Unter http://astore.amazon.com/cakesoftwaref-20 werden über einen Amazon-Shop Bücher zum Thema Design-Pattern angeboten, die vom CakePHP-Entwickler-Team empfohlen werden.


Struktur des Quellcodes / Design der Klassen
Das Release-Package ist sehr übersichtlich aufgebaut und die Unterscheidung von Core-Bestandteilen und eigenen Dateien fällt leicht. Es wurde eine strikte Benennungs- und Strukturierungskonvention eingeführt, die durch die Komponenten Inflector unterstützt wird. Anwender- Bibliotheken werden unter /apps abgelegt und bilden eine eigene Struktur. Klassen und Methoden sind sprechend benannt und im Quellcode gut dokumentiert.


Einsetzbarkeit für mehrere Applikationen
Das CakePHP-Framework bringt keine Logik für den Betrieb von Applikationen und Modulen unter unterschiedlichen Umgebungen mit. Die Klasse Configure kann zwar als Mittel zur Konfiguration eines Controllers oder einer beliebigen anderen Klasse eingesetzt werden, jedoch ist hier keine weitere Abstraktionsmöglichkeit geschaffen, die nativ mehrere Umgebungen unterstützt, so dass eine Applikation, oder ein Modul mit ein und dem selben Quellcode in mehreren Projekten eingesetzt werden kann. Es gibt jedoch die Möglichkeit, dieses Verhalten durch Setzen weiterer Konstanten zu erzeugen.


Erweiterbarkeit
Durch das modulare und gut strukturierte Design des Frameworks ist es ohne weiteres möglich die Funktionalität des Frameworks in allen Bereichen zu erweitern. Lediglich im GUI-Bereich stößt der Entwickler ohne Anpassung schnell an die Grenzen des Möglichen (siehe 3.1.4).


Scaffolding
Das Rapid-Development-Feature ist bei CakePHP sehr stark ausgeprägt. Zum einen gibt es eine Vielzahl an Tutorials, zum anderen ist der Scaffolding-Kern so gut implementiert, dass ein Termin-Kalender in weniger als 10 Handgriffen einsatzbereit und voll funktionsfähig war. Die Vielfalt der Möglichkeiten hier nochmals zu beschreiben würde den Rahmen des Artikels sprengen und liegt nicht im Haupt-Fokus. Aus diesem Grund sei an dieser Stelle auf die Webseite verwiesen, die zum Thema Scaffolding unter http://manual.cakephp.org/chapter/scaffolding mit einer ausführlichen Beschreibung aufwartet.
Ein weiteres Produktivitäts-Mittel ist das Tool bake, ein Tool, mit dem man eine Applikation automatisch erstellen kann - zumindest das Grundgerüst. Unter http://api.cakephp.org/bake_8p...tml#l00151 wird der Code beschrieben, im Manual finden sich jedoch leider keine ausführlichen Ressourcen zu diesem Thema. Auch im Release ist das Tool standardmäßig leider nicht enthalten.


3.1.7. Dokumentation

Dokumentation des Quellcodes
Ist der Entwickler mit einem komplexen Problem konfrontiert, ist der Blick in den Quellcode oft die einzige Rettung. Bei CakePHP kann die Lösung recht schnell gefunden werden, da der Quellcode übersichtlich gestaltet und gut dokumentiert ist. Negativ fällt ins Auge, dass sich sehr viele Methoden der Funktion func_get_args() bedienen um die Argumente bei Aufruf einer Methode auszulesen. Dies erschwert an manchen Stellen das Nachvollziehen der Methoden-Logik und macht den Code intransparent.


API-Dokumentation
Die API-Dokumentation von CakePHP ist online unter http://api.cakephp.org verfügbar. Als Verbesserungsvorschlag wäre anzubringen, die API-Dokumentation mit dem Release mit auszuliefern, damit diese für den Entwickler immer in der aktuellen Version verfügbar ist.


Einführungen, Tutorials und Anwendungs-Beispiele
Wie bereits weiter oben angesprochen finden sich unter http://manual.cakephp.org/ und unter http://bakery.cakephp.org/ viele Tutorials und Anwendungsbeispiele. http://cakeforge.org/top/mostactive.php zeigt eine Übersicht der aktiven Projekte, die auf CakeForge - dem Sourceforge der Cake Software Foundation - gehostet werden. Hierunter finden sich Projekte wie "JiveCMS", "MiniCalendar" oder "TinyAuth", die CakePHP als Basis für ihre Entwicklungen nutzen. Insbesondere die Projekte können für noch nicht erfahrene Anwender als Quelle für Umsetzungsbeispiele verwendet werden.
Kritikwürdig ist die etwas oberflächliche Art und Weise der Beispiele im Manual, die gerade Anfänger etwas im Dunkeln tappen lässt. An vielen Stellen ist der Blicke in die API-Doku und den Quellcode nicht vermeidbar was für Neulinge zunächst abschreckend wirkt. Hier wäre mehr Ausführlichkeit in den Beispielen eine gerne gesehene Verbesserung.
Anzumerken ist zudem, dass die angegebenen Literatur-Stellen nur in englischer Sprache verfügbar sind. Die Seiten unter http://cakephp.org sind zudem nicht X-Browser kompatibel. Dabei werden vor allem IE- und Opera-Benutzer mit verzerrten Layouts empfangen.


ChangeLogs / Migrations-Hinweise für API-Änderungen
Zu den auf der Webseite herunterladbaren Versionen existiert jeweils ein Changelog, mit dem der Entwickler bei API-Änderungen schnell einen Überblick über die veränderten Bereiche hat.



3.1.8. Support
CakePHP verfügt mit http://www.nabble.com/CakePHP-f16511.html und weiteren nicht direkt als CakePHP-Forum deklarierte Support-Foren über eine große Support- Struktur. Das CakePHP-Team selbst bereibt einen IRC-Channel. Zudem existieren mehrere Newsgroups und Mailing-Listen auf denen der Entwickler Rat suchen kann. Mit der Bakery (http://bakery.cakephp.org/) existiert darüber hinaus ein Portal / Wiki, auf dem die aktuellsten News und viele interessante Artikel zu CakePHP zu finden sind. U.a. gibt es dort eine "Code-Snippet"-Ecke, in der immer wieder gesuchte Code-Schnipsel zu finden sind.



3.1.9. Benchmark
Im Benchmark-Test konnte mit den CakePHP eigenen Mittel eine Rendering-Zeit von durchschnittlich 0.1134 s gemessen werden. Rendering-Zeit ist bei CakePHP die Zeit der kompletten Abarbeitung des Codes.


» Weiter auf Seite 4 (Bewertung CodeIgniter).


Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
« 1   »
Einträge/Seite: | 5 | 10 | 15 | 20 |
1
Christian Achatz 04.01.2008, 00:16:12
Ergänzend zu den Inhalten auf dieser Seite möchte ich noch auf die Diskussion im Forum hinweisen. Hier wurden einige wichtige Hinweise aus der Praxis eingebracht, die ein weiteres Verständnis für die Thematik bringen.

=> http://forum.adventure-php-framework.org/de/viewtopic.php?f=5&t=20