Modul
Ein Modul ist eine in sich geschlossene Einheit, die aus Models, Views, Controllern und evtl. weiteren Komponenten besteht. In vielerlei Hinsicht erinnert ein Modul an eine Applikation. Der wesentliche Unterschied besteht darin, dass ein Modul nicht für sich allein betrieben werden kann und in eine Applikation eingebettet werden muss. Anwender können auf die Controller eines Moduls genauso wie auf gewöhnliche Controller einer Anwendung zugreifen.
Module sind in vielen Situationen nützlich. Eine große Anwendung könnte in mehrere Module unterteilt werden, die alle einzeln entwickelt und gewartet werden können. Häufig benötigte Features, wie Benutzer- oder Kommentarverwaltung, könnten ebenfalls als Modul implementiert werden, um sie in späteren Projekten einfach wiederverwenden zu können.
Erstellen eines Moduls
Ein Modul wird in einem Verzeichnis mit der eindeutigen Modul-ID
als Namen untergebracht. Die Struktur eines solchen Modulverzeichnisses ähnelt dem
Anwendungsverzeichnis.
Hier die typische Struktur eines Moduls, in diesem Fall mit dem Namen
forum
:
forum/ ForumModule.php die Klassendatei des Moduls components/ enthält wiederverwendbare Benutzerkomponenten views/ enthält Viewdateien für Widgets controllers/ enthält Klassendateien von Controllern DefaultController.php Die Klassendatei des Standardcontrollers extensions/ enthält Erweiterungen von Dritten models/ enthält Klassendateien von Models views/ enthält View- und Layoutdateien für Controller layouts/ enthält Layout-Viewdateien default/ enthält Viewdateien für den Standardcontroller index.php die Datei des Index-Views
Ein Modul muss eine Modulklasse beinhalten, die von CWebModule abgeleitet
wurde. Der Klassenname wird gemäß dem Ausdruck ucfirst($id).'Module'
gebildet,
wobei $id
sich auf die Modul-ID (bzw. den Verzeichnisnamen des Moduls)
bezieht. Die Modulklasse dient zum Ablegen von Informationen, die
im gesamten Modul benötigt werden. Man kann z.B.
CWebModule::params oder CWebModule::components verwenden, um
Parameter bzw. Komponenten
auf Modulebene bereitzustellen.
Tipp: Sie können den Modulgenerator in Gii verwenden, um das Grundgerüst eines Moduls zu erstellen.
Verwenden von Modulen
Um eine Modul zu verwenden, legen Sie das Modulverzeichnis zunächst im
modules
-Ordner des
Anwendungsverzeichnisses
ab. Geben Sie dann die Modul-ID im Konfigurationsparameter
modules an. Um zum Beispiel das obige
forum
-Modul zu verwenden, ändert man die
Konfiguration
folgendermaßen:
return array( ...... 'modules'=>array('forum',...), ...... );
Auch für ein Modul können die Startparameter wie üblich eingestellt werden,
ähnlich zur Konfiguration von
Anwendungskomponenten.
Das forum
-Modul könnte zum Beispiel einen Parameter postPerPage
(Beiträge
pro Seite) in seiner Modulklasse kennen, der dann folgendermaßen in der
Konfiguration
angegeben wird:
return array( ...... 'modules'=>array( 'forum'=>array( 'postPerPage'=>20, ), ), ...... );
Über die module-Eigenschaft
des aktiven Controllers kann dann auf die Modulinstanz zugegriffen werden, um
solche Parameter auszulesen Um zum
Beispiel die obige postPerPage
-Information kann z.B. so erhalten werden:
$postPerPage=Yii::app()->controller->module->postPerPage; // oder wenn $this sich auf die Controllerinstanz bezieht: // $postPerPage=$this->module->postPerPage;
Eine Controller-Action in einem Modul kann über die
Route modulID/controllerID/actionID
aufgerufen werden. Würde das forum
-Modul z.B. einen PostController
enthalten, würde die Route
forum/post/create
die Action create
in diesem Controller aufrufen.
Die entsprechende URL für diese Route wäre dann
http://www.example.com/index.php?r=forum/post/create
.
Tipp: Liegt ein (Modul-)Controller in einem Unterverzeichnis von
controllers
kann man trotzdem das beschriebene Routen-Format verwenden. LiegtPostController
zum Beispiel inforum/controllers/admin
, lautet die Route zu dessencreate
-Actionforum/admin/post/create
.
Verschachtelte Module
Module können in unbegrenzter Tiefe ineinander verschachtelt werden. Das bedeutet,
dass ein Modul ein weiteres Modul enthalten kann, welches wiederum ein anderes
Modul beherbergt. Wir nennen ersteres Elternmodul, letzeres
Kindmodul. Kindmodule müssen in der
modules-Eigenschaft des jeweiligen Elternmoduls
angebeben werden und zwar genauso wie in der Anwendungskonfiguration
(siehe oben).
Um eine Controller-Action in einem Kindmodul aufzurufen,
wird die Route elternModulID/kindModulID/controllerID/actionID
verwendet.