Heim >Backend-Entwicklung >PHP-Tutorial >Yii2.0 – Modul
Ein Modul ist eine unabhängige Softwareeinheit, die aus Modellen, Ansichten, Controllern und anderen unterstützenden Komponenten besteht. Endbenutzer können auf die Controller der installierten Module im Anwendungskörper zugreifen. Das Modul wird als kleiner Anwendungskörper behandelt Der Unterschied zwischen dem Hauptteil und dem Hauptteil besteht darin, dass das Modul nicht unabhängig bereitgestellt werden kann und zum Hauptteil einer Anwendung gehören muss.
Modul erstellen
Das Modul ist in einem Verzeichnis namens [[yiibaseModule::basePath|base path]] organisiert. In diesem Verzeichnis gibt es Unterverzeichnisse wie Controller, Modelle und Ansichten Es entspricht Controllern, Modellen, Ansichten und anderem Code und ist der Anwendung sehr ähnlich. Das folgende Beispiel zeigt die Verzeichnisstruktur eines Modells:
forum/ Module.php 模块类文件 controllers/ 包含控制器类文件 DefaultController.php default 控制器类文件 models/ 包含模型类文件 views/ 包含控制器视图文件和布局文件 layouts/ 包含布局文件 default/ 包含DefaultController控制器视图文件 index.php index视图文件
Modulklasse
Jedes Modul verfügt über eine Modulklasse, die [[yiibaseModule]] erbt, und die Klassendatei wird direkt darin abgelegt Das Modulverzeichnis [[yiibaseModule::basePath|base path]] und kann automatisch geladen werden. Wenn auf ein Modul zugegriffen wird, wird eine eindeutige Instanz der Modulklasse erstellt, ähnlich der Anwendungskörperinstanz. Die Modulinstanz wird verwendet, um den Code innerhalb des Moduls bei der gemeinsamen Nutzung von Daten und Komponenten zu unterstützen.
Das folgende Beispiel definiert grob eine Modulklasse:
namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this->params['foo'] = 'bar'; // ... 其他初始化代码 ... } }
Wenn die init()-Methode viel Code zum Initialisieren von Moduleigenschaften enthält, können Sie diese in der Konfiguration speichern und verwenden Folgender Code in init() wird geladen:
public function init() { parent::init(); // 从config.php加载配置来初始化模块 \Yii::configure($this, require(__DIR__ . '/config.php')); }
Die Konfigurationsdatei config.php kann den folgenden Inhalt enthalten, ähnlich der Hauptkonfiguration der Anwendung
<?php return [ 'components' => [ // list of component configurations ], 'params' => [ // list of parameters ], ];
Controller in Modulen
Steuerelemente für Module erstellen Bei der Verwendung eines Moduls besteht die Konvention darin, die Controller-Klasse im Controller-Unternamensraum des Modulklassen-Namensraums zu platzieren, was auch bedeutet, dass die Controller-Klassendateien im Controller-Unternamensraum des Moduls platziert werden [[yiibaseModule::basePath|base path]] Verzeichnis im Verzeichnis. Um beispielsweise im Forum-Modul im vorherigen Abschnitt einen Post-Controller zu erstellen, sollte die Controller-Klasse wie folgt deklariert werden:
namespace app\modules\forum\controllers; use yii\web\Controller; class PostController extends Controller { // ... }
Das Attribut [[yiibaseModule::controllerNamespace]] kann zur Anpassung konfiguriert werden die Benennung des Controller-Klassenraums: Wenn sich einige Controller nicht mehr im Namespace befinden, können Sie das Attribut [[yiibaseModule::controllerMap]] konfigurieren, um sie zugänglich zu machen, ähnlich wie in der Konfiguration des Anwendungskörpers.
Ansichten im Modul
Die Ansichten sollten im Verzeichnis „views“ unter dem Verzeichnis abgelegt werden, das dem [[yiibaseModule::basePath|base path]] des Moduls entspricht Die Controller im Modul sollten im Verzeichnis „views/ControllerID“ abgelegt werden, wobei „ControllerID“ der Controller-ID entspricht. Wenn beispielsweise die Controller-Klasse „PostController“ lautet, entspricht das Verzeichnis dem Verzeichnis „views/post“. Modul [[yiibaseModule::basePath|Basispfad]] Verzeichnis.
Module können ein Layout angeben, das beim Rendern der Controller-Ansicht des Moduls verwendet wird. Die Layoutdatei wird standardmäßig im Verzeichnis „views/layouts“ abgelegt. Sie können das Attribut [[yiibaseModule::layout]] konfigurieren, um den Layoutnamen anzugeben. Wenn der Layoutattributname nicht konfiguriert ist, wird standardmäßig das Anwendungslayout verwendet .
Module verwenden
Um ein Modul in einer Anwendung zu verwenden, müssen Sie das Modul nur zur Liste der [[yiibaseApplication::modules|modules]]-Attribute in der Konfiguration des Anwendungskörpers hinzufügen. Wie in der Anwendung des folgenden Codes gezeigt, verwendet die Hauptkonfiguration das Forum-Modul:
[ 'modules' => [ 'forum' => [ 'class' => 'app\modules\forum\Module', // ... 模块其他配置 ... ], ], ]
[[yiibaseApplication::modules|modules]] Das Attribut verwendet das Modulkonfigurationsarray, und jeder Array-Schlüssel ist der Modul-ID, die das eindeutige Modul in der Anwendung identifiziert. Der Wert ist die Konfiguration, die zum Erstellen des Moduls verwendet wird.
Routing
Ähnlich wie beim Zugriff auf Anwendungscontroller wird auch beim Routing der Controller im Modul verwendet. Die Route für den Controller im Modul muss mit der Modul-ID beginnen, gefolgt vom Controller ID und Vorgangs-ID. Angenommen, die Anwendung verwendet ein Modul namens Forum, stellt die Route forum/post/index die Indexoperation des Post-Controllers im Modul dar. Wenn die Route nur die Modul-ID enthält, ist der Standardwert [[yiibaseModule::defaultRoute]. ]-Attribut wird verwendet, um die Verwendung zu bestimmen, d. h. das Routing-Forum kann den Standard-Controller des Forum-Moduls darstellen.
Zugriffsmodul
In einem Modul müssen Sie möglicherweise häufig eine Instanz einer Modulklasse abrufen, um auf Modul-ID, Modulparameter, Modulkomponenten usw. zuzugreifen. Dazu können Sie die folgende Anweisung verwenden Erhalt:
$module = MyModuleClass::getInstance();
MyModuleClass entspricht der gewünschten Modulklasse. Wenn das Modul nicht angefordert wird, gibt diese Methode eine leere zurück Es ist nicht erforderlich, eine Modulklasse manuell zu erstellen, da diese sich von der automatisch erstellten unterscheidet, wenn Yii die Anfrage verarbeitet.
Zusätzlich: Bei der Entwicklung eines Moduls können Sie nicht davon ausgehen, dass das Modul eine feste ID verwendet, da das Modul in der Anwendung oder anderen Modulen einer beliebigen ID entsprechen kann. Um die Modul-ID zu erhalten, sollten Sie dies tun Verwenden Sie den obigen Code, um die Modulinstanz abzurufen, und rufen Sie dann die Modul-ID über $module->id ab.
Sie können auch mit den folgenden Methoden auf Modulinstanzen zugreifen:
// 获取ID为 "forum" 的模块 $module = \Yii::$app->getModule('forum'); // 获取处理当前请求控制器所属的模块 $module = \Yii::$app->controller->module;
第一种方式仅在你知道模块ID的情况下有效,第二种方式在你知道处理请求的控制器下使用。
一旦获取到模块实例,可访问注册到模块的参数和组件,例如:
$maxPostCount = $module->params['maxPostCount'];
引导启动模块
有些模块在每个请求下都有运行, [[yii\debug\Module|debug]] 模块就是这种, 为此将这种模块加入到应用主体的 [[yii\base\Application::bootstrap|bootstrap]] 属性中。
例如,如下示例的应用主体配置会确保debug模块每次都被加载:
[ 'bootstrap' => [ 'debug', ], 'modules' => [ 'debug' => 'yii\debug\Module', ], ]
模块嵌套
模块可无限级嵌套,也就是说,模块可以包含另一个包含模块的模块,我们称前者为父模块,后者为子模块, 子模块必须在父模块的[[yii\base\Module::modules|modules]]属性中申明,例如:
namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this->modules = [ 'admin' => [ // 此处应考虑使用一个更短的命名空间 'class' => 'app\modules\forum\modules\admin\Module', ], ]; } }
在嵌套模块中的控制器,它的路由应包含它所有祖先模块的ID,例如forum/admin/dashboard/index代表 在模块forum中子模块admin中dashboard控制器的index操作。
最佳实践
模块在大型项目中常备使用,这些项目的特性可分组,每个组包含一些强相关的特性, 每个特性组可以做成一个模块由特定的开发人员和开发组来开发和维护。
在特性组上,使用模块也是重用代码的好方式,一些常用特性,如用户管理,评论管理,可以开发成模块, 这样在相关项目中非常容易被重用。