Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Das Model-View-Controller-Modell am Beispiel CakePHP

Model, View und Controller: Begriffe, mit denen man nicht sofort etwas anfangen kann. Auch trotz vieler Erklärungen schreckt das, auf den ersten Blick komplizierte, Modell viele Menschen davon ab sich daran zu versuchen. Auch ich habe es erst nach drei Versuchen geschafft, was jedoch wahrscheinlich vorher an meiner Ungeduld scheiterte.

CakePHP

CakePHP Logo

Ich habe für diese Erklärung das Framework CakePHP benutzt, um einen Praxisbezug herzustellen und weil ich es gerade ausgiebig benutze. CakePHP ist ein offenes Web-Framework, das an Ruby on Rails angelehnt wurde. Die Prinzipien davon sind:

  • Don’t repeat yourself (Nichts zweimal programmieren)
  • Convention before configuration (Lieber alles nach einem festgelegten Muster benennen, als etwas einzustellen.)

Model

Model View Controller Prinzip

Das Model gibt die grundlegende Beziehung der Daten zueinander an. Es legt also das Datenmodell fest, in ihm wird der Name der Klasse festgelegt und hier wenden auch SQL-Joins definiert. Zudem stehen auch Aktionen, die vor dem Speichern in die Datenbank auszuführen sind, im Model.

Noch einmal am Beispiel einer CakePHP-Anwendung zur Arbeitserfassung von verschiedenen Benutzern:

 1<?php
 2
 3class User extends AppModel{
 4	// Name der Klasse festlegen
 5	var $name = 'User';
 6
 7	// Mit einem Join Tabellen verbinden
 8	var $hasAndBelongsToMany = array(
 9	    'Work' => array(
10		'className' => 'Work'
11	    )
12	);
13	 
14	// Passwörter vor dem Speichern hashen
15	function beforeSave($options) {
16	    if (isset($this->data[$this->alias]['password'])) {
17		$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
18	    }
19	    return true;
20	}
21}
22
23?>

View

Der View stellt die Seite dar, die der Benutzer schließlich zu Gesicht bekommt. Es wird damit die Anzeige der Daten in HTML und PHP formuliert. Für (fast) jede Aktion im Controller (unten) muss ein View vorhanden sein.

Auch dazu wieder ein Beispiel:

 1<div class="page-header">
 2	<h1>Benutzer</h1>
 3</div>
 4<table class="table table-striped">
 5	<tr>
 6		<th>Id</th>
 7		<th>Benutzername</th>
 8		<th>Vorname</th>
 9		<th>Nachname</th>
10		<th>Aktionen</th>
11	</tr><?php foreach ($users as $user): ?>
12	<tr>
13		<td><?php echo h($user['User']['id']); ?></td>
14		<td><?php echo h($this->Html->link($user['User']['username'], "/users/view/".$user['User']['id'])); ?></td>
15		<td><?php echo h($user['User']['firstname']); ?></td>
16		<td><?php echo h($user['User']['lastname']); ?></td>
17		<td><?php echo h("<a href='" . $this->Html->Url(array('action' => 'edit', $user['User']['id'])) . "'><i class='icon-pencil'></i></a>"); ?>&nbsp; <?php echo h("<a href='" . $this->Html->Url(array('action' => 'delete', $user['User']['id'])) . "'><i class='icon-trash'></i></a>"); ?></td>
18	</tr><?php endforeach; ?>
19</table>

Controller

Der Controller definiert schließlich die verschiedenen Aktionen der Klasse. Das sind zum Beispiel users/index, users/view/2 und users/add, die als URL in der Anwendung erscheinen. Diese werden über gleichnamige Funktionen im Controller erstellt. In den Funktionen werden auch Daten aus der Datenbank gelesen und geschrieben. Ebenfalls im Controller findet die Überprüfung von Formulardaten statt.

Beispiel:

 1
 2
 3<?php
 4class UsersController extends AppController
 5
 6{
 7	var $name = 'Users';
 8
 9	// Überprüfung des Passwortes
10
11	public $validate = array(
12
13		'password' => array(
14			'required' => array(
15				'rule' => array(
16					'minLength',
17					'5'
18				) ,
19				'message' => 'Ein Passwort mit mindestens 5 Stellen wird benötigt'
20			)
21		)
22	);
23
24	// Alle Benutzer auflisten, $users steht in View "index" zu Verfügung
25
26	function index()
27	{
28		$this->set('users', $this->User->paginate("all"));
29	}
30
31	// Einen Benutzer anzeigen, $user steht in View "view" zu Verfügung
32
33	function view($id = null)
34	{
35		$this->User->id = $id;
36		$this->set('user', $this->User->read());
37		if (!$this->User->exists()) {
38			throw new NotFoundException(__('Benutzer nicht gefunden!'));
39		}
40	}
41}
42
43?>

Zusammenfassung

Man kann zusammenfassend sagen, dass das Modell nicht so kompliziert ist wie sein Name. Wenn man es einmal verstanden und angewendet hat, kann man mit wenig Aufwand und schnell dynamische Webanwendungen schreiben, die beliebig erweiterbar sind.

Noch einmal kurz die drei Begriffe und ihre Bedeutung:

  • Model: Beziehung der Daten
  • View: Anzeige der Daten
  • Controller: Verarbeitung der Daten

edit: Artikel bearbeitet nach Hinweisen von ‘mar’.