Artikel » PHP-Frameworks im Test (3)
PHP-Frameworks im Test (3)
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.
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.
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.
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.
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.
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.
Die installierte Version ist zu PHP 4 (im Test: Version 4.4.6) kompatibel.
Die installierte Version ist zu PHP 5 (im Test: Version 5.2.1) kompatibel.
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.
Es ist zunächst keine nachträgliche Konfiguration des Packages notwenig, es ist ohne diese
lauffähig.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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. Das hier angesprochene
Tutorial kann unter
newbie-cakephp.pdf
heruntergeladen werden. 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.
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.
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.
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.
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).
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
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