Logo von CakePHP

Nun habe ich in letzter Zeit auch ein wenig in Sachen CakePHP dazu gelernt. Einige meiner Erfahrungen und Kniffe möchte ich an dieser Stelle an euch weiter geben. Gedacht sind sie gerade für Einsteiger in die Thematik, für alte Hasen sind viele der Tipps sicherlich nichts neues.

Sollten euch vielleicht auch noch nützliche Tipps zu diesem Thema einfallen, so sind diese natürlich in den Kommentaren jederzeit willkommen.

01. Nutzt die Bakery, CakeForge …

Die Bakery ist sowohl für Cake Neulinge als auch Profis, neben der API, immer die Anlaufstelle Nummer 1. Nutzt einfach die Suche, für viele alltägliche Probleme bzw. Wünsche gibt es hier die passende Anleitung, z.B. die Integration von FCKEditor, TinyMCE oder Textile in eure bestehende Applikation. Die Bakery ist aber auch dann sehr nützlich, wenn man evtl. noch auf der Suche nach einem tollen Feature ist, oder man sich einfach ein wenig ausprobieren möchte.

CakeForge ist ebenfalls gerade für Einsteiger eine tolle Möglichkeit sich andere CakePHP-Projekte einmal anzusehen. Sei es um sie als Basis für die eigenen Projekte zu verwenden, oder einfach den Aufbau von CakePHP besser zu begreifen.

02. …und das CakePHP-Cheatsheet

Gerade für Anfänger ist es manchmal ein wenig schwer, sich die Cake-Funktionen direkt zu merken, bzw. zu wissen, welche Konstanten, Variablen oder Methoden es in den einzelnen Views, Models oder Controllern eigentlich so gibt.

Aus diesem Grund gibt es das CakePHP-Cheatsheet (PDF). Einfach ausdrucken und in sichtbare Reichweite hängen, dass hat auch mir schon viel Kramerei im Manual und der API gespart.

03. Abfrage-Bedingungen direkt in der Methode verankern

Dies erhöht zum einen die Lesbarkeit eures Quelltextes, und ist auch schneller in der Schreibweise. Hier ein kurzes Beispiel, die im Prinzip beide jedoch das selbe bewirken:

#Zwar auch verständlich, aber es geht sicherlich noch kürzer...
$this->Model->findAll(array('gender' => 'male'));
#Und zwar so:
$this->Model->findAllByGender('male');

Geht natürlich nur dann, wenn man relativ einfache Bedingungen an die Abfrage knüpft.

04. Models bzw. Controller ohne Datenbank-Tabelle

Cake geht normalerweise davon aus, dass jedes angelegte Model auch eine Tabelle in der eingestellten Datenbank benötigt. Nun ist das ab und an jedoch gar nicht nötig, z.B. wenn man ein Bestellformular programmiert, das nach dem Absenden die Daten einfach an ein Mailpostfach versendet, und diese nicht abspeichert. Um nicht extra eine leere Tabelle dafür anlegen zu müssen, kann man im Model einfach folgendes definieren:

var $useTable = false;

Über diese Variable kann man zudem nicht nur die Datenbankfunktion für das aktuelle Model ausknipsen, sondern auch die Naming Conventions “überschreiben”.

Beispiel: Normalerweise würde Cake bei einem Model mit Namen “User” die Tabelle “users” erwarten, nun machen wir aber eine deutsche Applikation und nennen daher das Model “Benutzer”, eine Tabelle mit Namen “benutzers” wäre jetzt doch ein wenig komisch, daher könnten wir dem Model an dieser Stelle mitteilen, das wir lieber die Tabelle “benutzer” nutzen möchten, und zwar via var $useTable = "benutzer";.

05. Mehrere Validierungsregeln auf ein Feld anwenden.

In Cake kann man ein Feld wie folgt relativ einfach validieren:

	var $validate = array(
		'name' => VALID_NOT_EMPTY,
		'email' => VALID_NOT_EMPTY);

Um nun mehrere der Regeln für ein und das selbe Feld festzulegen kann man z.B. auch folgendes machen:

	var $validate = array(
		'name' => VALID_NOT_EMPTY,
		'email' => VALID_NOT_EMPTY,
		'email' => VALID_EMAIL);

Obwohl in diesem Beispiel wohl auch VALID_EMAIL eine Eingabe erfordern würde, doch es geht ja erstmal nur ums Prinzip

06. Datenfelder aus dem Controller heraus als invalide markieren.

Eigentlich nicht Sinn der Sache, aber evtl. für den ein oder anderen doch mal unumgänglich.

$this->MyModel->invalidate('email');

Dies würde im Model das Feld “email” in “MyModel” als falsch deklarieren.

07. Eigene Layouts für die Flash-Methode erzeugen

Die Flash-Methode in CakePHP erspart einem viel Zeit, wenn es um schnelle und einfache Statusausgaben an den User geht. Eine Flashnachricht kann man in Cake relativ einfach im Controller erzeugen, und zwar über

$this->flash('Der Benutzer wurde erfolgreich angelegt!','/'.CAKE_ADMIN.'/users/',3);

Dieses Beispiel würde die Nachricht “Der Benutzer wurde erfolgreich angelegt!” auf dem Bildschirm ausgeben, und nach 3 Sekunden automatisch auf den Unterordner /users/ im Cake-Adminverzeichnis weiterleiten, was es damit auf sich hat kommt im nächsten Tipp.

Nun sieht diese Statusausgabe im Standard sehr nüchtern aus, nämlich S/W ohne Rahmen oder anderen Firlefanz. Das mag den Puristen unter uns gefallen, ich jedoch passe auch die Flashbox meist an das Layout der Seite an. Um das zu erreichen besorgen wir uns aus dem Cake-Core die datei flash.thtml, welche wir unter cake/libs/views/templates/layouts finden. Diese kopieren wir uns nun in das Verzeichnis views/layouts in unserem APP-Ordner. Nun können wir den Inhalt der Flash-Seite nach belieben anpassen, alle benötigten Variablen sind in der Vorlage bereits enthalten.

08. Nutzung der CakePHP Admin-Route

CakePHP bringt eine für viele sicherlich interessante Funktion mit, und zwar alle administrativen Actions in ein gesondertes Adminverzeichnis auszulagern, hierzu ein Beispiel:

Normalerweise würde eine Action zur Bearbeitung eines Benutzers z.B. unter der URL www.domain.de/users/edit/23 zu finden sein. Nutzt man die Admin-Routes, so könnte man diese Funktion auch in www.domain.de/admin/users/edit/23 auslagern, somit hätte man alle administrativen Actions klar in der URL getrennt.

Um die Admin-Routes zu aktivieren müssen wir in der core.php die Zeile define(’CAKE_ADMIN’, ‘admin’); auskommentieren. Wie man sieht kann man hier auch den Namen des Admin-Ordners festlegen. Um Cake am Ende noch mitzuteilen, welche der Actions denn jetzt nur über die Adminroute aufrufbar ist, setzen wir vor die jeweilige Action im Controller einfach den namen des Admin-Ordners, in unserem Beispiel würde die Action dazu also z.B. so aussehen:

function admin_edit($id = null) {...}

09. Für wiederkehrende Objekte elements einsetzen

Beim Output von Content hat man teilweise Objekte die auf fast jeder Seite angezeigt werden müssen, wie z.B. Hinweisfelder. Nun wäre es nicht so schön in jedem View immer wieder den selben HTML-Code einzufügen, denn muss dieser einmal geändert werden fängt die Wurstelei erst richtig an.

Um das zu verhindern gibt es die Elements. Elements können im Ordner app/views/elements abgelegt werden, und tragen die Endung *.thtml, also wie unsere ganz normalen Views auch. Wir können unsere Elements auch dynamisch gestalten und z.B. Variablen dort einbinden.

Nehmen wir an wir haben eine immer wiederkehrende Nachrichtenbox (im Beispiel: msgbox.thtml), bei der sich jedoch von Seite zu Seite immer nur der jeweilige Text ändern. Dafür können wir im Layout unseres Elements z.B. die Variable $msgtext ausgeben. Um das Element nun in einem unserer Views an einer beliebigen Stelle aufzurufen macht man einfach folgendes:

<?php echo $this->renderElement('msgbox', array(
	"msgtext" => "Dies ist ein Hinweis")); 
?>

In dem Array kann man natürlich beliebig viele Werte übergeben.

10. Versucht den Code richtig zu trennen

Eine Sache die mir derzeit auch noch etwas schwer fällt, jedoch wirklich durchgesetzt werden sollte. Cake gibt einem teilweise die Möglichkeit bestimme Funktionen sowohl im Model, Controller als auch im View zu benutzen, so kann man z.B. auch im Controller über

$this->pageTitle = 'Mein Browsertitel';

Den HTML-Title betanken, doch ist dies sicherlich nicht im Sinne des Erfinders, denn hierbei handelt es sich schließlich um eine direkte Ausgabe, für welche ja eigentlich der View-Part zuständig wäre. Versucht also möglichst immer den Code in die richtige Sektion zu packen, also M, V oder C…



Kommentare zum Thema 10 Tipps in Sachen CakePHP:

1 | Webstandard-Team schrieb am 22.06.2007 um 11:19
Gravatar dieses Kommentators

Klasse Artikel, danke vor allem für den Link zum Cheatsheet ;o)

2 | pdaether schrieb am 24.06.2007 um 12:12
Gravatar dieses Kommentators

Zu Punkt 5:
Wenn Du in dem Array zweimal den gleichen Key verwendest, dann wir der erste Eintrag einfach überschrieben, mehrere Regeln für ein Feld kann man so nicht angeben…

Ab 1.2 ist die Möglichkeit für mehrere Regeln eingebaut, für 1.x muss man sich noch anders behelfen.

3 | Christian schrieb am 24.06.2007 um 12:47
Gravatar dieses Kommentators

Danke für den Tipp (ist ja eigentlich auch logisch), obwohl die Validierungsregeln in C1.1 ja eh stark eingeschränkt sind. Hast du evtl. einen Tipp womit man die Regeln in 1.1 weiter ausbauen könnte?

Ich habe ja mal einen kurzen Blick auf 1.2 geworfen…die Regeln die man dort definieren kann sind natürlich wirklich um einiges detaillierter, vielleicht sollte ich doch mal umsteigen ^^

4 | pdaether schrieb am 24.06.2007 um 20:56
Gravatar dieses Kommentators

Na ja, die meisten Regeln lassen sich zum Glück mit nur einem regulären Ausdruck darstellen.
Wenn komplexere Valdierungen gefragt sind, pack ich die i.d.R. direkt in die beforeValidate() Methode des Models.
1.2 bietet da auf jeden Fall mehr. Gerade die Behaviors für Models finden ich auch sensationell.

5 | Uli schrieb am 26.07.2007 um 08:53
6 | paulr schrieb am 22.04.2008 um 17:25
Gravatar dieses Kommentators

hab da mal ne Frage zu 10. wie sollten deiner Meinung nach dynamische Seitentitel generiert wenn nicht über den Controller?

Kommentar-Feed für diesen Artikel


Kommentarfunktion für diesen Artikel geschlossen.



Blogsuche

RSS-Feeds

Plaste & Plastik

plasteundplastik.de - Das Geocaching-Weblog

Die Kategorien


Netz-Fundstücke


Meta / Propaganda