Websiteentwicklung: PHP: CakePHP

CakePHP Logo

Was ist CakePHP?

Bearbeiten

CakePHP selbst versteht sich als MVC-Framework für schnellere oder - in diesem Kontext auch - agilere Webserviceprogrammierung. Dabei wirkt CakePHP wie eine weitere Applikationsschicht, auf der man letztenendes programmieren kann. MVC steht für Model-View-Controller und definiert drei unterschiedliche Bereiche, die miteinander kommunizieren und bestimmte Dienste zur Verfügung stellen. Das Model bietet den Zugang zu externen Datenquellen wie Datenbanken oder APIs. Der View ist darauf spezialisiert die - eventuell gefilterten und bearbeiteten - Daten an den Browser weiter zu leiten. Der Controller ist die Schaltzentrale jeder Cake-Anwendung und verbindet das Model mit dem View.

CakePHP folgt zusätzlich einigen Richtlinien, die beim Einsatz durch Frameworks zum tragen kommen:

  • CoC: Convention over configuration
  • DRY: Don't repeat yourself
  • CRUD: CREATE, READ, UPDATE, DELETE

Namenskonventionen

Bearbeiten

Durch Namenskonventionen beschleunigt CakePHP die Entwicklung einer Anwendung. An einigen Stellen reicht es, wenn bestimmte Elemente einer gewissen Konvention entsprechen. Diese werden für andere Elemente durch die Einhaltung der Konvention automatisch sichtbar und müssen nicht gesondert konfiguriert werden.

Dateinamen und Klassen

Bearbeiten

Dateien werden mit unterstrichen geschrieben, während dazugehörige Klassennamen groß und klein geschrieben werden. Eine Klasse, die MySuperController heißen soll, wird daher in einer Datei Namens my_super_controller.php gespeichert.

Model und Datenbanken

Bearbeiten

Models werden im Singular notiert und entsprechen der Tabellenbezeichung aus der genutzten Datenbank. Eine Tabelle namens user wird als Model in CakePHP als Klasse User in der Datei user.php im models Ordner gespeichert.

Tabellenverknüpfungen werden automatisch erkannt, sobald die Einträge in der Tabelle einem gewissen Muster entsprechen. Ein Beispiel wäre die hasMany Verknüpfung zwischen document und tag. Ein Dokument kann also mehrere Tags haben. In der Tags-Tabelle wird dafür ein Fremdschlüssel auf die Spalte document_id gelegt.

Controller

Bearbeiten

Jedes Model benötigt standardmäßig einen Controller. Dieser ist immer im Plural zu benennen. Für das Beispiel-Model Invoice würde der Controller InvoicesController heißen. CakePHP verarbeitet hier die korrekte Mehrzahlangabe, zumindest für die englische Sprache. Ebenfalls ist CakePHP in der Lage dem Model Callory den Controller CalloriesController zuzuweisen.

Jeder Controller erhält unterschiedliche Views. Je nachdem welche Methoden ein Controller besitzt (Beispiel: index) gibt es auch dementsprechende Views. Diese Views werden, für das Beispielmodel User mit dem Controller UsersController im Ordner app/views/users/index.ctp. Die Verarbeiteten Daten in der Methode index() im Controller werden im View index.ctp im Anschluss für den Browser in HTML gepackt.

Besitzt ein Controller mehrere Methoden, die unterschiedliche Ausgaben haben müssen, lassen sich alle Views gemeinsam im entsprechenden Ordner ablegen.

Architektur

Bearbeiten
 
Cakephp Schema - Einfach

Das Model stellt die Verbindung zur Datenquelle bereit. Diese kann je nach Typ variieren und wird in der Datei app/config/database.php eingetragen. Jedes Model in CakePHP stellt einen Zugang zu einer Tabelle in einer Datenbank bereit, vorausgesetzt, die Datenquelle ist eine Datenbank. Das Model bietet allerdings noch einige andere Features:

  • Bezug von Daten aus einer Datenquelle
  • Bereitstellung der Daten für den Controller
  • Validierung eingegebener Daten
  • Daten in der Datenbank erstellen, erneuern, löschen
  • Verknüpfungen zu anderen Modellen aufbauen

Bezug von Daten

Bearbeiten

Das Model bietet zur Datenabfrage die Methode find(). Diese erzeugt intern die nötigen SQL Befehle, um die Anweisungen des Programmieres in die Tat umzustzen. Die Methode unterstützt folgende Parameter:

  • all: Gibt alle Datensätze zurück, die mit den zusätzlich übergebenen Parametern übereinstimmen
  • first: Gibt nur das erste Ergebnis zurück
  • count: Gibt nur die Anzahl an Ergebnissen zurück, die bei den Bedingungen gefunden worden ist
  • list: Gibt alle Datensätze zurück, ähnlich wie all, allerdings werden diese in Key-Value-Paare ausgegeben
  • neighbours: Gibt die benachbarten Datensätze zurück

Bereitstellung der Daten

Bearbeiten

Die Darstellung der Daten innerhalb eines Modells findet innerhalb eines mehrdimensionalen Arrays statt. Folgende Beispieltabelle liegt vor:

id name email status
1 defc0n defc0n(at)foobar.com 1
2 mitm mitm(at)foobar.com 0

Diese Daten würden im Modell wie folgt dargestellt werden:

[User] => Array
(
   [0] => Array
   (
       [id] => 1
       [name] => defc0n
       [email] => defc0n(at)foobar.com
       [status] => 1
   )
   [1] => Array
   (
       [id] => 2
       [name] => mitm
       [email] => mitm(at)foobar.com
       [status] => 0
   )
)

Validierung von Daten

Bearbeiten

Viele Webapplikationen nutzen Formulare, die auf der Serverseite geprüft werden müssen. Darunter fallen beispielsweise E-Mail Adressen, Kreditkarten-Nummern oder es soll ein Datum eingegeben werden. Erfahrene Nutzer würden wohl als erstes an reguläre Ausdrücke denken. Dieses hat CakePHP bereits integriert, lässt aber auch eigene Kreationen zu.

Die Validierung erfolgt im Model innerhalb der validate Variable und wird als mehrdimensionales Array dargestellt. Beispielsweise gibt es ein Formular, welches ein Datum vom Benutzer entgegen nehmen soll. Das Feld, in dem das Datum eingetragen wird, heißt meinDatum. Dazu lässt sich die Variable validate wie folgt befüllen:

var $validate = array(
       'meinDatum' => 'date'
);

Es können auch Fehlermeldungen angepasst werden, die automatisch angezeigt werden:

var $validate = array(
         'meinName' => array(
            'rule' => false,
            'required' => true,
            'message' => 'Bitte geben Sie einen Namen ein!'
           ),
        );

Datenbank Manipulation

Bearbeiten

Verknüpfungen zu anderen Modellen

Bearbeiten

Controller

Bearbeiten

Erweiterte Architektur

Bearbeiten
 
Add caption here

Die Architektur von CakePHP erlaubt einige Module selber zu erstellen, die wieder genutzt werden. Ganz nach dem Motto Don't repeat yourself! lassen sich Controller, Model, View und sogar ganze Applikationen erweitern. Die Erweiterungen des Controllers nennen sich Components. Die des Models sind die Behaviours und die erweiternden Module im View sind die Helper und Elements.

Möchte man als Entwickler bereits geschriebene Applikationen in neuen Nutzen, so lassen sich diese als Plugins wieder verwenden. Man sollte allerdings darauf achten, dass man für diesen Fall seine Module auch als Plugins entwickelt, so dass kein zusätzlicher Programmieraufwand entsteht.

Components

Bearbeiten

Components sind Bauteile, die dem Controller angehören. Sie befinden sich innerhalb des controllers Ordner in einem eigenen Ordner namens components. Innerhalb eines Controllers kann man auf Components nur zugreifen, wenn dies explizit angegeben ist:

var $components = array('MyTestComponent1', 'MyTestComponent2');

function index()
{
    if($this->MyTestComponent2 == true)
         echo "Component1 funktioniert";
}

Ein Component Objekt selbst erbt von der Klasse Object. Zusätzlich wird eine initialize Funktion eingebaut, um die Zugehörigkeit zu einem Controller zu sichern. Anschließend folgen die Methoden, die das Component-Objekt ausmachen.

class MyTestComponent2 extends Object
{
    protected $__controller = null;

    function initialize(&$controller)
    {
        $this->__controller = $controller;
    }

    // Beispiel Methode
    public function array_add(&$array, $value)
    {
        array_push($array, $value);
    }
}

Man sollte darauf achten, dass eventuell übergebene Arrays als Referenz übergeben werden, da sonst der Speicherverbrauch sehr stark ansteigen könnte.

Behaviors

Bearbeiten

Elements

Bearbeiten

Voraussetzungen

Bearbeiten

Installation der Grundanwendung

Bearbeiten

Grundkonfiguration

Bearbeiten

Datenbankanbindung

Bearbeiten

Erstes Model

Bearbeiten
  • Datei: app/model/user.php
<?php
class User extends AppModel
{
   // Name des Models ist im Controller sichtbar
   var $name = 'User';
}

?>

Erster Controller

Bearbeiten
  • Datei: app/controller/users_controller.php
<?php
class UsersController extends AppController
{
   function index()
   {
      // alle Daten aus dem User Modell beziehen
      $users = $this->User->find('all');
      
      // Daten im View zugänglich machen
      $this->set('users', $users);
   }
}
?>

Erstes View

Bearbeiten
  • Datei: app/view/users/index.ctp