Hinweis: Module werden seit Version 1.0.3 unterstützt.
Ein Modul ist eine in sich geschlossene Einheit, die aus Models, Views, Controllern und anderen tragenden 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 Fällen nützlich. Eine große Anwendung könnte in mehrere Module unterteilt werden, die alle einzeln entwickelt und gewartet werden können. Einige häufig auftretende Features, wie Benutzer- oder Kommentarverwaltung, können als Modul entwickelt werden, um sie in späteren Projekten einfach wiederverwenden zu können.
Ein Modul wird in einem Verzeichnis mit der eindeutigen ID
des Moduls untergebracht. Die Struktur eines Modulverzeichnisses ist ähnlich
zum
Stammverzeichnis
der Anwendung. Im Folgenden sehen Sie die typische Struktur eines Moduls 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 mit dem Ausdruck ucfirst($id).'Module'
gebildet,
wobei $id
sich auf die Modul-ID (oder den Verzeichnisnamen des Moduls)
bezieht. Die Modulklasse dient als zentraler Speicherort für Informationen, die
vom ganzen Modulcode verwendet werden. Wir können zum Beispiel
CWebModule::params oder CWebModule::components verwenden, um
Modulparameter bzw.
Anwendungskomponenten
auf Modulebene bereitzustellen.
Tipp: Wir können den
yiic
-Befehl verwenden, um das Grundgerüst eines Moduls anzulegen. Um zum Beispiel das obenstehendeforum
-Modul zu erstellen, können wir folgende Befehle an der Eingabeaufforderung ausführen:% cd WebRoot/testdrive % protected/yiic shell Yii Interactive Tool v1.0 Please type 'help' for help. Type 'exit' to quit. >> module forum
Um eine Modul zu verwenden, legen Sie zunächst das Modulverzeichnis unter
modules
im
Stammverzeichnis
der Anwendung ab. Deklarieren Sie danach die Modul-ID über die Eigenschaft
modules der Anwendung. Um zum Beispiel das obige
forum
-Modul zu verwenden, können wir folgende
Anwendungskonfiguration
vornehmen:
return array(
......
'modules'=>array('forum',...),
......
);
Für ein Modul können auch Startwerte für dessen Eigenschaften konfiguriert
werden. Die Konfiguration erfolgt dabei ähnlich zu der von
Anwendungskomponenten.
Das forum
-Modul könnte zum Beispiel eine Eigenschaft postPerPage
(Beiträge
pro Seite) in seiner Modulklasse haben, die wir folgendermaßen in der
Anwendungskonfiguration
definieren können:
return array(
......
'modules'=>array(
'forum'=>array(
'postPerPage'=>20,
),
),
......
);
Auf die Instanz des Moduls kann über die module-Eigenschaft
des gerade aktiven Controllers zugegriffen werden. Über die Modulinstanz
können wir auf die gesammelten Informationen auf Modulebene zugreifen. Um zum
Beispiel die obige postPerPage
-Information auszulesen, können wir folgenden
Ausdruck verwenden:
$postPerPage=Yii::app()->controller->module->postPerPage;
// oder den folgenden, 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. Wenn wir zum Beispiel annehmen, dass das obige
forum
-Modul einen Controller namens PostController
besitzt, können wir die
Route forum/post/create
verwenden, um
uns auf die Action create
in diesem Controller zu beziehen. Die
entsprechende URL für diese Route wäre dann
http://www.example.com/index.php?r=forum/post/create
.
Tipp: Wenn ein Controller in einem Unterverzeichnis unterhalb
controllers
abgelegt wurde, können wir immer noch das obige Format für die Route verwenden. Läge derPostController
zum Beispiel unterforum/controllers/admin
, könnten wir auf seine Actioncreate
überforum/admin/post/create
zugreifen.
Module können ineinander verschachtelt werden. Das bedeutet, dass ein Modul
ein weiteres Modul enthalten kann. Wir nennen ersteres Elternmodul, letzeres
Kindmodul. Kindmodule müssen im modules
-Verzeichnis des Elternmoduls
abgelegt werden. Um eine Controller-Action in einem Kindmodul aufzurufen,
sollten wir die Route elternModulID/kindModulID/controllerID/actionID
verwenden.
Signup or Login in order to comment.