# CakePHP

CakePHP, kurz Cake, ist ein in PHP geschriebenes quelloffenes Webframework. CakePHP ist angelehnt an Ruby on Rails und folgt ebenfalls dem Schema des Model View Controller (MVC). Weitere Gemeinsamkeiten mit Ruby on Rails sind die zugrunde liegenden Prinzipien Don’t repeat yourself (DRY) und Konvention vor Konfiguration.

## Geschichte

CakePHP wird seit 2005 entwickelt. Es entstand parallel zur steigenden Popularität von Ruby on Rails und dem Wunsch nach einem ähnlichen MVC-Framework auf PHP-Basis.

### Abspaltung Lithium

Im Oktober 2009 verließen der Projektmanager Garrett Woodworth und Entwickler Nate Abele das Projekt, um sich Lithium, einem ursprünglich als „Cake3“ geplanten Framework, zu widmen.

## Philosophie

Analog zu Ruby on Rails wird auch bei CakePHP versucht, die Konfiguration auf ein Minimum zu beschränken. Das heißt, dass der einzige Konfigurationsschritt die Festlegung der Verbindungsparameter zum Datenbankserver ist. Die Zuordnung von z. B. Models zu Datenbanktabellen geschieht über die Namensgleichheit in Singular und Plural, nicht über Konfigurationsdateien. Dieses Prinzip ist als Convention over Configuration (CoC) bekannt. Beispiel:

### Model

    User, Group (Singular)

### Controller

    UsersController, GroupsController (Plural)

### Datenbanktabelle

    users, groups, groups_users (Plural, letztes Beispiel zeigt den Namen für eine Relationstabelle für hasAndBelongsToMany. In diesem Fall werden die zu verknüpfenden Tabellen in alphabetischer Reihenfolge angegeben)

### Fremdschlüssel in Datenbanktabellen

    user_id, group_id (Singular plus _id)
CakePHP erkennt zum Beispiel Fremdschlüssel in Datenbanktabellen automatisch und erzeugt dementsprechend die korrekten Joins.

## Besonderheiten

Im Vergleich zu anderen Web-Frameworks stellt CakePHP nur geringe Anforderungen an den Webserver. Ab CakePHP 5 wird PHP 8.1 oder höher benötigt. Es verlangt keine separate Datenbank für die Anwendung, sondern erlaubt es, Datenbanktabellen mit Präfixen zu verwenden. Zugriff auf die Kommandozeile ist bei Verwendung von sogenannten Console Applications notwendig.

## Schichten
### Model

Als Backend einer CakePHP-Applikation kommt eine Datenbank zum Einsatz. Es werden die folgenden Datenbankmanagementsysteme unterstützt:
* MySQL
* PostgreSQL
* SQLite
* MSSQL
* Oracle
Das sogenannte Model stellt die vorhandenen Daten dar. In einer Benutzerverwaltung, welche mit Benutzer und Benutzergruppen arbeitet, sind die Benutzer (user) und Benutzergruppen (usergroup) die Models.
Jedes Model bringt eine Anzahl an Methoden mit, welche zur Verwaltung der Daten genutzt werden. Zum Beispiel gibt es Methoden zum Lesen aus der Datenbank (Model::read oder Model::findAllById), zum Speichern der Daten in die Datenbank (Model::save oder Model::saveField) oder zum Erstellen eines neuen Datensatzes (Model::create). Somit ist die CRUD-Funktionalität in den Models schon integriert.
Die Beziehungen zwischen verschiedenen Models werden über sogenannte Associations (Beziehungen) festgelegt. Dabei existieren folgende Möglichkeiten: hasOne, belongsTo, hasMany und hasAndBelongsToMany. CakePHP kann damit automatisch die benötigten Datenbankabfragen (inklusive eventuell benötigter Join-Befehle in SQL) generieren. Die Konfiguration geschieht durch die Einhaltung bestimmter Konventionen bei der Vergabe der Namen von Datenbanktabellen, Modellen und Controllern (siehe Abschnitt Philosophie). Es werden keinerlei Konfigurationsdateien benötigt.
Models können um Behaviours erweitert werden. Es handelt sich dabei um Klassen, in denen Funktionalität zur Erweiterung des Models gekapselt wird. Als Beispiel dient die Tree-Behaviour: sie erweitert ein beliebiges Model um Methoden, die zur Manipulation von Baumstrukturen dienen. Man sagt, das Model verhält sich wie ein Baum (Tree) – daher der Name Behaviour. Behaviours folgen dem Prinzip Don’t repeat yourself, da sie in mehreren Models verwendet werden können.
In Models können Validierungsinformationen hinterlegt werden, die bestimmen, was Felder enthalten dürfen oder nicht. In Formularen wird dann bei Validierungsfehlern automatisch eine Fehlermeldung angezeigt.

### Controller

Der Controller enthält die sogenannte Geschäftslogik und bietet Schnittstellen, um mit dieser zu interagieren. Diese Schnittstellen werden analog zu Ruby on Rails Actions genannt.
Eine HTTP-Anfrage (beispielsweise http://example.org/controller/action/parameter) enthält den Namen des Controllers und die auszuführende Methode (Action), die vom Dispatcher ausgewertet und dann an den entsprechenden Controller weitergeleitet werden. Es können auch Parameter für die Methode übergeben werden. Das Aussehen der URLs ist mithilfe von Routen sehr flexibel anpassbar.
Controller können durch Components in ihrer Funktionalität erweitert werden. CakePHP enthält selbst viele Komponenten, z. B. für die Session-Verwaltung, Request-Handling und Sicherheit. Auch Access Control Lists lassen sich realisieren.
Formulardaten, die der Controller von der jeweiligen View erhält, können mit der Funktion „Sanitize“ automatisch auf Malicious Code gefiltert werden, um SQL-Injections zu vermeiden.

### View

Unter einem View versteht man die Präsentationsschicht einer CakePHP-Applikation. Es handelt sich bei einem View um ein Template, welches durch die Ausgabedaten des jeweiligen Controllers mit Inhalten gefüllt wird. Dabei kann beliebiger PHP-Code in einem Template eingebettet werden. Views können zudem auch zwischengespeichert werden.
Für sich wiederholende Ausgaben in einem Projekt kann man auf Elements zurückgreifen, welche man sich als Templates innerhalb von Templates vorstellen kann.
Außerdem gibt es Helper, die häufig wiederkehrende Codes erzeugen, wie z. B. HTML-Formulare, JavaScript-Skripte und Code für AJAX-Kommunikation mit dem Server.
In der Entwicklungsphase kann auf die Erstellung von Views auch verzichtet werden, indem man im Controller die Scaffolding-Option nutzt. Dabei werden dynamisch Views zur Manipulation der Tabellen erstellt.

### Ähnliche Projekte

* Lithium Framework
* Agavi
* CodeIgniter
* eZ Components
* Kohana
* PHP on Trax
* Symfony
* Zend Framework
* Zikula
* Fusca RefactorPHP