Yii 模塊是獨立的 MVC 子應用,支持獨立控制器、模型、視圖、組件、配置。本文記錄從 Gii 生成到完整可用的標準化流程。
https://your-app/index.php?r=giitest生成目錄結構:
protected/modules/test/
├── TestModule.php # 模塊主類 (繼承 CWebModule)
├── controllers/
│ └── DefaultController.php # 默認控制器
├── views/
│ ├── default/
│ │ └── index.php # 默認視圖
│ └── layouts/ # 模塊專用佈局
└── (models/, components/) # 後續手動創建
<?php
// protected/config/main.php
return [
// ...
'modules' => [
'gii', // 現有
'admin', // 現有
'test', // 新增:模塊 ID
],
];
<?php
class TestModule extends CWebModule {
public function init() {
parent::init();
// 設置模塊級默認值 (覆蓋應用級)
Yii::app()->errorHandler->errorAction = 'test/default/error';
Yii::app()->defaultController = 'test/default';
Yii::app()->user->loginUrl = 'test/default/login';
// 導入模塊專用模型和組件 (自動別名註冊)
$this->setImport([
'test.models.*',
'test.components.*',
]);
}
}
瀏覽器訪問:https://your-app/index.php?r=test 或 https://your-app/test/ (開啟 path 格式 URL 後)
將命中:TestModule -> DefaultController -> actionIndex() -> views/default/index.php
| 類型 | 路徑 | 說明 |
|---|---|---|
| 控制器視圖 | views/ | 每個 action 一個視圖文件 |
| 模塊佈局 | views/layouts/ | 模塊專用佈局 |
| 應用佈局 | ../views/layouts/ | 父佈局,雙斜槓引用 |
<?php
// 模塊佈局 views/layouts/column.php 繼承應用佈局 main.php
$this->beginContent('//layouts/main'); // 雙斜槓 = 應用根佈局
?>
endContent(); ?>
<?php
class DefaultController extends Controller {
// 覆蓋父類屬性
public $layout = '//layouts/main'; // 使用應用根佈局
public $defaultAction = 'index'; // 默認 action
public function actionIndex() {
$this->render('index'); // 渲染 views/default/index.php
}
}
protected/modules/test/models/ 創建模型類 (如 TestForm.php)protected/modules/test/components/ 創建組件類 (如 TestHelper.php)TestModule::init() 中 setImport,可直接使用:$model = new TestForm();TestHelper::doSomething();
// protected/modules/test/config/main.php
return [
'components' => [
'db' => [ ... ], // 模塊專用 DB (可選)
],
'params' => [ ... ],
];
// TestModule.php 中加載
public function init() {
// ...
$config = require(__DIR__ . '/config/main.php');
foreach ($config as $key => $value) {
$this->$key = $value; // 或 Yii::app()->configure($config)
}
}
Yii 模塊化機制清晰強大:**Gii 生成骨架 → 主配置註冊 → 模塊類初始化覆蓋默認值 → 遵循目錄約定開發**。關鍵點在於 `TestModule::init()` 中統一設置應用級組件行為 (errorHandler, defaultController, user.loginUrl) 並導入模塊專用類。遵循此流程,新模塊即插即用,與主應用解耦且共享核心資源。