專案增長時,所有 Controller 集中在 controllers/、Model 在 models/ 會導致維護困難。模組將相關功能封裝為獨立單元 (含獨立 MVC、元件、視圖),實現高內聚、低耦合,支援無限巢狀嵌套。
protected/
├── modules/
│ └── admin/ # 模組 ID = admin
│ ├── AdminModule.php # 模組類別 (繼承 CWebModule)
│ ├── components/ # 模組專用元件
│ ├── controllers/ # 控制器
│ │ └── DefaultController.php
│ ├── models/ # 模型
│ ├── views/ # 視圖
│ │ ├── default/ # 對應 DefaultController
│ │ │ └── index.php
│ │ └── layouts/ # 佈局
│ │ └── main.php
│ └── messages/ # 國際化訊息
protected/config/main.php
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'your_password',
'ipFilters'=>array('127.0.0.1','::1'),
),
),
https://your-app/index.php?r=giiadmin → Preview → Generateprotected/ 可寫入

<?php
// protected/config/main.php
return array(
'modules'=>array(
'gii'=>array(...),
'admin', // 簡單註冊,使用預設配置
// 或帶參數註冊
// 'admin'=>array('web_url'=>'www.example.com'),
),
);
URL 格式:https://your-app/index.php?r=admin/default/index
admin = 模組 IDdefault = Controller ID (預設)index = Action ID (預設)預設模組使用主應用 protected/views/layouts/main.php。若需獨立佈局:
<?php
// protected/modules/admin/controllers/DefaultController.php
class DefaultController extends Controller {
public $layout = 'application.modules.admin.views.layouts.main';
// ...
}
將主佈局複製到 protected/modules/admin/views/layouts/main.php 並修改。
為避免檔案衝突、支援模組複用,使用 CAssetManager 發布私有資源到公開 /assets 目錄。
protected/modules/admin/assets/
├── css/screen.css
├── js/admin.js
└── images/logo.png
<?php
// protected/modules/admin/AdminModule.php
class AdminModule extends CWebModule {
private $_assetsUrl;
public function getAssetsUrl(): string {
if ($this->_assetsUrl === null) {
$this->_assetsUrl = Yii::app()->getAssetManager()->publish(
Yii::getPathOfAlias('application.modules.admin.assets')
);
}
return $this->_assetsUrl;
}
public function setAssetsUrl(string $value): void {
$this->_assetsUrl = $value;
}
}
<!-- protected/modules/admin/views/layouts/main.php -->
<link rel="stylesheet" type="text/css" href="<?php echo $this->module->assetsUrl; ?>/css/screen.css" />
<script src="<?php echo $this->module->assetsUrl; ?>/js/admin.js"></script>
整個 admin/ 目錄複製到新專案 protected/modules/ 下,註冊即用,資源路徑自動發布無衝突。
<?php
// main.php
'modules'=>array(
'admin'=>array(
'web_url'=>'www.example.com',
'page_size'=>20,
),
),
<?php
$webUrl = Yii::app()->controller->module->web_url;
$pageSize = Yii::app()->controller->module->page_size;
// 或
$module = Yii::app()->getModule('admin');
$webUrl = $module->web_url;
模組可包含子模組,理論無限嵌套:
modules/
└── admin/
└── modules/
└── report/ # 訪問: r=admin/report/default/index
子模組類別繼承 CWebModule,父模組 AdminModule 需在 init() 中設定:
public function init() {
$this->setModules(array(
'report'=>array('class'=>'application.modules.admin.modules.report.ReportModule'),
));
parent::init();
}
protected/components、protected/models。$this->module->assetsUrl。