? 環境
基于 Yii2 高級模板
? 前言
高級模板默認將前后臺分離:frontend 前臺應用 和 backend 后臺應用,在使用時我們需要為這兩個應用分別綁定域名,例如:frontend.domain.com,backend.domain.com
在我們常規的項目開發中,這種前后臺獨立分離的方式可能導致一些潛在的問題,最明顯的問題比如:
1.在后臺 backend 上傳圖片后(例如:/uploads/pic01.jpg),前臺 frontend 無法直接訪問通過 /uploads/pic01.jpg 這樣的相對路徑訪問,因為前后臺的域名是不一樣的。
2.在后臺的 Kindeditor 富文本框中添加了一些圖片或附件(例如:/uploads/img01.jpg),那么前臺 frontend 也無法直接訪問通過 /uploads/img01.jpg 這樣的相對路徑訪問,也是因為前后臺的域名是不一樣的。
3....
當然你可能有很多解決方案,比如前臺圖片顯示是增加后臺的域名、服務器端設置 alias 訪問 /uploads、使用類似阿里云OSS對象存儲等等。
但是這些修改真的挺麻煩,我就開發一個小項目,我就想后臺上傳了就前臺直接能訪問,完全不想弄那么繁瑣的配置,而 Yii2 的模塊 Modules 功能就能很好的解決這個問題。
? Yii2 模塊介紹
關于 Yii2 的模塊(Modules),你可以參閱 官方手冊 進行了解。
其實高級模板中 frontend 和 backend 也可以理解為模塊,但是他們可以單獨部署(可以綁定獨立的域名),所以他們又是高級模塊(官方稱之為應用主體),是所有其它自定義模塊的根級別的父模塊。
Yii2 的模塊設計是可以無限嵌套的,但是默認安裝完后,每個 應用主體 下面只有一個主模塊,其 MVC 目錄結構直接位于應用的根目錄下。
利用 Yii2 的模塊可以嵌套功能,我們可以在 frontend 這個 應用主體 下創建兩個子模塊:index(前臺) 和 admin(后臺)
,這樣前臺和后臺都是在同一個域名下(frontend.domain.com),這樣就完美解決了文章開頭所講的問題了。
當然,因為后臺以 子模塊 的形式嵌入到 frontend 內了,那么系統自動創建 backend 就無用武之地。
? Yii2 模塊代碼
假定 frontend 應用主體綁定的域名為 frontend.domain.com,同時我們需要在 frontend 下面新增 index 和 admin 兩個子模塊,操作如下:
1. 新建子模塊目錄
\frontend\modules\index
\frontend\modules\index\views
\frontend\modules\index\models
\frontend\modules\index\controllers
\frontend\modules\admin
\frontend\modules\admin\views
\frontend\modules\admin\models
\frontend\modules\admin\controllers
2. 新建子模塊類
2.1 新建 index 子模塊對象文件 \frontend\modules\index\Module.php,內容如下:
<?php
namespace frontend\modules\index;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
}
}
這個文件內的 類 主要供 應用主體 實例化模塊對象。
2.2 新建 index 子模塊的默認控制器文件 \frontend\modules\index\controllers\SiteController.php,內容如下:
<?php
namespace frontend\modules\index\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
public function actionIndex()
{
echo 'You Access <b>'.$this->module->id.'</b> Sub Module'; exit();
}
}
子模塊 admin 也同樣按照以上方式創建文件,注意需要把 index 改 admin
3. 配置子模塊類
那 應用主體 如何知道它需要啟動哪些模塊呢?這個就需要我們將模塊的信息寫入到 應用主體 的配置文件里,編輯 /frontend/config/main.php,新增以下內容:
'modules' => [
'index' => ['class'=>'frontend\modules\index\Module'],
'admin' => ['class'=>'frontend\modules\admin\Module'],
],
到此還沒完,因為你會發現現在訪問 frontend.domain.com,打開的頁面沒有任何變化,這說明了現在應用主體還是訪問之前默認的主模塊,那如何才能訪問到 index 和 admin 子模塊:
http://frontend.domain.com/index.php?r=index/site/index
http://frontend.domain.com/index.php?r=kernel/site/index
通過設置 URL 參數中的路由參數 r 即可,其格式為:r=[Module]/[Controller]/[Action]
4.調整子模塊配置
4.1 設置 frontend 應用主體 的默認子模塊
未設置前, Yii2 默認會直接訪問 frontend 應用主體 的主模塊,即 /frontend/controllers/SiteController;當然,我現在希望 Yii2 默認直接訪問 index 子模塊;編輯 /frontend/config/main.php,修改如下配置即可:
# 設置默認的路由,格式:[Module]/[Controller]/[Action]
# 以下配置可以在無路由參數的情況直接進入 index 子模塊的 SiteController::actionIndex
'defaultRoute' => 'index/site/index';
# 設置默認的控制器命名空間
# 以下配置可以省略 URL 中路由參數的 [Module] 數據
'controllerNamespace' => 'frontend\modules\index\controllers'
4.2 設置子模塊的默認布局
未設置前,frontend 應用主體 下的 子模塊 默認都直接調用主模塊的布局,即/frontend/views/layouts/main.php;明顯,這策略不適合多個子模塊,我們希望每個 子模塊 默認調用其自身根目錄下 views/layouts/main.php;編輯 子模塊 根目錄下的 Module.php,在 init() 函數內添加如下代碼:
# 該成員變量未設置值時,將調用父模塊錄的布局目
# 該成員變量被設置值后,將調用當前模塊的布局目錄
$this->layout = 'main';
- Yii2使用Url組件
- Yii2的Html,Request組件詳解
- YII2.0框架, 多圖片上傳功能
- yii2-imagine配置
- 有潔癖的禁止默認YII自帶垃圾代碼(個人認為)、JS、CSS(新手教程)
- Yii2 API接口輸出統一Json和jsonp格式方法
- MySql 創建表的一些語句釋義
- Yii2聯合查詢(配合GridView)
- Yii 通用系統字典
- ArrayHelper的多維數組排序函數multisort,強大無比。
- 路由規則,在Url中替換使用'/'以外的符號連接
- 從excel文件中讀取表格內容,并批量寫入數據庫
- yii2注冊時驗證用戶名、郵箱等唯一性
- Yii2最全的實戰教程
- Composer安裝yii2-imagine 壓縮,剪切,旋轉,水印
- LinkPager增加總頁數 和總記錄數
- Yii2 獲取模塊名控制器名方法名
- Yii2使用yii2-adminlte+yii2-admin左側菜單子路徑不高亮問題又解
- 前端CSS框架
- Yii2 之 frontend 子模塊實踐之一:添加前后臺子模塊
- Yii2 之 frontend 子模塊實踐之二:構建子模塊的獨立配置
- Yii2 之 frontend 子模塊實踐之三:布局和語言配置
- 完美解決ajax驗證碼不刷新問題,讓驗證碼更加美觀,不修改任何源代碼
- yii2.0 表單小部件常用的默認選中
- Yii2 controller 傳值給layout
- yii2 dropDownList 二級和三級 聯動寫法
- 微信掃碼登錄 新窗口二維碼 掃完關閉二維碼頁面 進入登錄頁面
- yii2 實現 "上一篇,下一篇" 功能
- Yii 行為簡單應用
- SQL語句