3.5 Controller
# Einführung
Der Originaltext dieses Abschnitts hat sich seit der letzen Übersetzung geändert. Bitte hilf dabei die Unterschiede zu lösen. Du kannst:
Ein Controller ist dazu da, um die Logik eurer Web-Applikation zu regeln. Meistens erledigt ein Controller seine Arbeit nur für ein einziges Model. Beispielsweise würde ein RezepteController sämtliche Aktionen, des Rezept-Models und ein ZutatenController sämtliche Aktionen des Zutaten-Models ausführen. Im Controller werden die Daten, die der jeweilige View zur Darstellung benötigt (für eine Auflistung aller Rezepte also beispielsweise ganz einfach alle Datenbankeinträge des Rezept-Models) aufbereitet und dem View zur Verfügung gestellt. Datenbankqueries werden so zwar im Controller (weil die Queries selbst Programmlogik sind) initiiert, allerdings mit dem Model ausgeführt (weil das Model die Schnittstelle zwischen Controller und Datenbank darstellt). Der Name des Controllers ergibt sich aus der Pluralform des Namen des Models gefolgt vom Wort Controller.
Das Rezept-Model wird vom RezepteController, das Produkt-Model vom ProdukteController und das Zutat-Model vom ZutatenController bedient und so weiter.
Beachte, dass für die obigen Beispiele eventuell Veränderungen in der inflections.php im config-Ordner vonnöten sind, da CakePHP eigentlich nur englische Wörter selbstständig pluralisieren kann.
Die Controller eurer Web-Applikation sind Klassen, die vom CakePHP AppController erben, der wiederrum von der Controller-Klasse erbt. Das hat den Grund, dass ihr den AppController in eurem controllers-Verzeichnis ueberschreiben und mit Standardwerten und Funktionen versehen könnt. Die entsprechende PHP-Datei dafür muss sich bei /app/app_controller.php befinden.
Controller können eine beliebige Anzahl an Methoden besitzen, die üblicherweise als Aktionen oder englisch actions bezeichnet werden. Allerdings muss nicht jede Methode eine Aktion sein. Eine Aktion ist eine Methode, die einen View darstellt, das heißt in den meisten Fällen auch direkt über www.webseite.de/controllerpluralname/aktion/variable1/variable2 aufgerufen werden kann (es ist deswegen aber nicht verboten, dem Controller Methoden zu implementieren, die nur von anderen Aktionen genutzt werden, selbst aber keine Aktion sind). Ein Rezepte-Controller könnte zum Beispiel eine parameterfreie index()-Aktion haben (das ist auch die Standardaktion die aufgerufen wird, falls die Adresse ohne Aktionsname eingegeben wird). In dieser könnte man dann alle Rezepte auflisten. Zusätzlich könnte er eine detailansicht($name)-Aktion haben, die als einen Parameter den Namen des Rezeptes bekommt. Der Aufruf www.webseite.de/rezepte/kaesekuchen bringt dann den Controller dazu die Methode detailansicht("kaesekuchen") zu starten.
<?php
# /app/controllers/rezepte_controller.php
class ReczepteController extends AppController {
function detailansicht($name) {
$rezept = $this->Rezept->findByName($name);
$this->set("rezept",$rezept);
}
function index() {
$rezepte = $this->Rezept->find('all');
$this->set("rezepte",$rezepte);
}
}
?>
<?php# /app/controllers/rezepte_controller.phpclass ReczepteController extends AppController {function detailansicht($name) {$rezept = $this->Rezept->findByName($name);$this->set("rezept",$rezept);}function index() {$rezepte = $this->Rezept->find('all');$this->set("rezepte",$rezepte);}}?>
Im obigen Beispiel geschieht in beiden Aktionen fast das gleiche. In der Methode detailansicht($name) wird der entsprechende Datensatz mit der Model-Methode (deswegen heißt es auch $this->Rezept->find... und nicht $this->find...) findBy
Die beiden Views können dann ganz einfach auf die Daten zugreifen, da ihnen nun die Variable $rezept respektive $rezepte, die alle Daten der Tabelle beinhalten, zur Verfügung stehen.
CakePHP bringt bereits eine Menge an sinnvollen Controller-Methoden mit. Darauf wird nun in diesem Kapitel näher eingegangen.


























