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
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
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>"); ?> <?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’.