0 follower

Modul

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.

1. Erstellen eines Moduls

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 obenstehende forum-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

2. Verwenden von Modulen

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 der PostController zum Beispiel unter forum/controllers/admin, könnten wir auf seine Action create über forum/admin/post/create zugreifen.

3. Verschachtelte Module

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.