CakePHP

Rapid Prototyping Framework

David Heinemeier Hanson hat mit Ruby on Rails vorgemacht, wie man in 15 Minuten sein eigenes Blog programmiert [1]. Das hat für Inspiration in anderen Projekten gesorgt und bewirkt, dass heute fast alle Skriptsprachen mit einem vergleichbaren Framework daherkommen. CakePHP ist ein solches MVC-Framework für PHP 4 und 5.

Make my day

Zwei wichtige Grundsätze, aus denen sich eine Produktivitätssteigerung ergibt, sind „Don't Repeat Yourself“ (DRY) und „Convention over Configuration“, also die sinnvolle Wahl von Konventionen. Zum einen sollte man sich nicht ständig wiederholen, da dies Wartung und Refactoring (Grundlegende Optimierung der Code-Struktur) meist aufwändiger macht. Zum anderen kann man sich gut auf einen Basissatz von Konventionen einlassen, wenn ein klar erkennbarer Sinn dahinter steht und das Framework nicht im Weg ist, wenn man etwas anders machen möchte. In der Wahl des für sich geeigneten Frameworks spielt die Akzeptanz dieser Konventionen eine wichtige Rolle. Nur so lässt sich eine Produktivitätssteigerung erreichen.

Scaffolding ist ein von Ruby on Rails übernommener Begriff, der im Deutschen soviel wie Baugerüst bedeutet. Übertragen liefert das PHP-Framework also ein Grundgerüst für den ersten Prototypen. CakePHP bietet dazu das bake.php-Skript auf der Kommandozeile. Mit einem Wizard generiert man die typischen CRUD-Methoden (übliche Datenbankzugriffe wie Create, Retrieve, Update, Delete) eines Models, inklusive Templates, Validierung und Ablauf. Auf diesem Ergebnis aufbauend kann man dann eventuelle Anpassungen vornehmen und so eine erste Basis als Diskussionsgrundlage für ein neues Projekt erstellen.

Scaffolding, also ein Grundgerüst für die Entwicklung, beschleunigt die Entwicklung eines Prototypen.

Scaffolding, also ein Grundgerüst für die Entwicklung, beschleunigt die Entwicklung eines Prototypen.

MVC

Grundsätzlich wird eine CakePHP-Applikation per Konvention über das Entwurfsmuster MVC (Model-View-Controller) strukturiert. Daraus ergibt sich eine saubere Trennung zwischen Daten, Ablaufsteuerung und Präsentation. Das Model ermöglicht den einfachen Zugriff auf die Datenbank sowie die Definition von Validierungen und Assoziationen. Reguläre Ausdrücke validieren die Daten, wobei es für den Anfänger auch ein paar vordefinierte Konstanten wie VALID_EMAIL, VALID_NUMBER oder VALID_NOT_EMPTY gibt. Komplexere Validierungen mit Abhängigkeiten sind problemlos möglich, ohne dass die Model-Klasse dabei an Übersicht verliert.

PHP
class User extends AppModel {
	var $name = 'User';
	var $validate = array('email'=>VALID_EMAIL);
	function beforeSave() {
		if (isset($this->data['password']) {
			$this->data['password'] = md5($this->data['password']);
		}
	}
}
Listing 1

Der Controller nimmt das Request entgegen und delegiert meist ausschließlich innerhalb einer Methode den Ablauf von der Model-Ebene bis zum Template. Die Applikation baut automatisch eine URL-Struktur anhand der vorhandenen Controller auf (z. B. /users/login/), sofern „mod_rewrite“ im Apache aktiviert ist.

Die Views (Templates) bestehen aus reinem HTML und PHP. Man benutzt lediglich Schleifen und Verzweigungen, um die dynamischen Inhalte in den HTML-Code einzufügen. Dabei wird man tatkräftig von den in CakePHP bereits vorhandenen HTML-, Form- bzw. Ajax-Helpern unterstützt. Ein von Helpern generiertes Formular ist so im Handumdrehen erstellt, wird sofort validiert und in der Datenbank gespeichert.

In die wichtigsten Methoden, die von Model (find/read, save) und Controller (render) mitgebracht werden, kann man über Callbacks wie „beforeSave()“ eingreifen. In Listing 1 wird bei jedem Speichern eines Users geprüft, ob das Passwort gespeichert werden soll. Wenn ja, wird es vorher über einen MD5-Hash kodiert. Applikationsweite Modifikationen der Model- und Controller-Klassen können im AppController respektive AppModel eingefügt werden. So spart man sich Wiederholungen in allen oder zumindest in vielen Controllern/Models.

Handwerkszeug

Controller übergreifende Funktionalität, die keinem Model zugehörig ist, wird in Komponenten untergebracht. Ab Version 1.2 gibt es auch für das Model sogenannte „Behaviours“, wodurch ein Model mit gewissen Charaktereigenschaften ausgestattet werden kann. CakePHP liefert bereits Komponenten für Security-, Session- und Request-Handling mit. Diese helfen in der Applikation dabei, Zugriffe auf die Session-Variablen zu vereinheitlichen oder festzustellen, ob der Request per Ajax gestellt wurde. Hilfreich ist auch die Sanitize-Klasse, mit der man spielend leicht sämtliche Formulareingaben von potenziellen Cross-Site-Scripting-Gefahren befreien kann. Grundsätzlich befreit einen der Einsatz von CakePHP aber nicht davon, sich Gedanken über Sicherheitsaspekte zu machen.

Schön ist, dass die eigenen Komponenten in neuen Projekten problemlos wiederverwendet werden können. Am besten teilt man diese direkt mit der CakePHP-Community auf CakeForge [2]. Dort existiert bereits eine Vielzahl von Komponenten, meist mit dazugehörigen Artikeln in der Bakery [3] (Artikel- und Tutorialsammlung, die das alte Wiki abgelöst hat).

Steht man noch ganz am Anfang, hilft meist ein erster Blick ins Handbuch. Dort werden die Bausteine des Frameworks mit Codebeispielen sehr gut erklärt. Unterstützung findet man auch in der Google Group cake-php [4]. Dort hat man Zugriff auf eine große Zahl bereits gestellter Fragen. Neue Fragen an die Liste oder im IRC werden meist schnell beantwortet, sowohl von der Community als auch vom Entwicklungsteam selbst. Auch in den vielen Blogs wie ThinkingPHP, CakeBaker oder der deutschen CakeBakery [5] findet man meist gute Tipps.

Test-driven Development in PHP?

Wer sich nicht darauf verlassen möchte, dass ein schneller Hotfix irgendwie gut geht, kann seine Model mit Unit Tests versehen und bequem über die Weboberfläche der Testsuite von CakePHP bedienen. Diese basiert auf SimpleTest und ist mit anderen xUnit-Implementationen vergleichbar.

Test-driven Development wird in der Community noch ein wenig stiefmütterlich behandelt, die Wahl liegt beim Entwickler. Nach der Erfahrung des Autors ist es jedoch sinnvoll, den eigenen Entwicklungsprozess stetig zu verbessern – CakePHP macht den Einstieg dabei sehr leicht.

Buzzword 2.0

Wer das Interface seiner Applikation ein wenig moderner gestalten möchte, wird auch hier von CakePHP unterstützt. Der Ajax-Helper generiert häufig verwendete JavaScript-Funktionalitäten wie Autocomplete-Eingabefelder, das Abschicken von Formularen oder Drag & Drop direkt in die Templates, so dass auch unbeholfene Programmierer in den Genuss von XmlHttpRequests in der eigenen Applikation kommen. Der Helper verwendet dazu die beiden JavaScript-Bibliotheken Prototype und Scriptaculous. Diese sind in ihrem Gesamtumfang nicht gerade klein, deshalb sollte man darauf achten, sie nur an der richtigen Stelle einzubinden. Bevorzugt man eine andere JavaScript-Bibliothek, etwa jQuery, lässt man den Ajax-Helper einfach weg.

Performance

Grundsätzlich bringt ein Framework einen Overhead mit sich. Auf der anderen Seite liefert es meist auch die Stellschrauben, um gerade die performancekritischen Bereiche zu optimieren.

Bei der agilen Entwicklung sollte man sich zunächst auf die Applikation selbst konzentrieren. Erst anschließend empfiehlt es sich herauszufinden, wo die Schwachstellen liegen. Da die Einschätzungen dazu während der Entwicklung häufig falsch sind, vermeidet man durch dieses Vorgehen unnötige und zeitintensive Verbesserungen, die sich später als überflüssig herausstellen. Profiling, also die Analyse des Programmcodes auf Geschwindigkeit und Ressourcennutzung, gibt meist deutlich bessere Aufschlüsse darüber, wo der Schuh drückt. Bei CakePHP-Applikationen bedeutet dies meist, dass man Datenbankanfragen optimiert (Entfernen von Assoziationen mit „unbindModel“), das Caching aktiviert und auf jeden Fall einen OpCode-Cache [6] auf dem Server installiert. Allein dadurch tritt der Overhead des Frameworks vollkommen in den Hintergrund. Eine gute Einführung in das Caching mit CakePHP findet man im letzten Teil der IBM-Serie „Cook web sites fast with CakePHP“ [7].

CakePHP ruft auf cakephp.org zum Spenden für das Projekt auf.

CakePHP ruft auf cakephp.org zum Spenden für das Projekt auf.

Fazit

CakePHP ist ein robustes Framework, dessen Community im letzten Jahr enorm gewachsen ist. Rapid Prototyping heißt dabei nicht, dass CakePHP nur ein Toolkit zur Erstellung von Click-Dummies oder Konzeptvisualisierungen ist. Die Einsatzgebiete sind vielfältig und das Framework sorgt dafür, das Entwickler während eines Projekts weder den Spaß am eigenen Code noch den Überblick darüber verlieren. So wird man zwar nicht zum besseren Programmierer, aber die Konzentration auf die wesentlichen Aufgaben fördert die Qualität und die Produktivität enorm.

- Anzeige-

Dieser Artikel stammt aus:

 

Weitere Artikel dieser Ausgabe

TYPO3 plus Flash ? Zwei Beispiele aus der Praxis

Die Website als Markenerlebnis inszenieren

Grundsätzlich ist Flash für Webentwickler gleichzeitig Segen und Fluch: Weil gute Flash-Programmierer... »

AJAX Framework ? barrierearm

Umfangreiche AJAX-Webseiten schnell entwickeln mit TYPO3

AJAX – die Kerntechnologie im vielgepriesenen Web 2.0 – ist in aller Munde. Viele... »

Ajax-Community

Seit Ende 2005 gibt es die Ajax-Community, die sich voll und ganz dem Web-2.0-Trendthema Ajax... »

Börsengang 2.0

Venture Capital bringt Open Source an den Aktienmarkt

Ein Ereignis wirft seine Schatten voraus: die Ankündigung von MySQL, an die Börse gehen... »

CeBIT Open-Source-Planer

Ein Überblick über Open Source und Linux bei der CeBIT 2007

Im vergangen Jahr berichtete das T3N Magazin erstmals zum Thema Open Source im Rahmen der CeBIT.... »

Collax Business Server

Linux für den Mittelstand

Geboren im Jahr 1991, entwickelte sich das Open-Source-Betriebssystem Linux Schritt für... »

Das Dojo-Toolkit

...der sanfte Ajax-Einstieg

Das Dojo-Toolkit ist ein modular aufgebautes JavaScript-Toolkit für die Erstellung von Ajax-Anwendungen.... »

Datenjonglage mit TYPO3

Keine Angst vor der Portierung großer Websites nach TYPO3

Die Portierung des Online-Informationssystems EUFIS»

Datenmanagement mit LIMBAS

Ein PHP-basiertes Werkzeug im Baukastenprinzip

Schon immer war es eine schwere Aufgabe, LIMBAS in wenigen Sätzen zu beschreiben, denn... »

Shop  |  T3N Ausgaben  |  Open Source & TYPO3 Marktplatz
Übersicht  |  News  |  hype! Open Source & Web 2.0  |  RSS Feeds