Yii2 之 frontend 子模組實踐之一:新增前後臺子模組
▪ 環境
基於 Yii2 高階模板
▪ 前言
高階模板預設將前後臺分離:frontend
前臺應用 和 backend
後臺應用,在使用時我們需要為這兩個應用分別繫結域名,例如:frontend.domain.com,backend.domain.com
在我們常規的專案開發中,這種前後臺獨立分離的方式可能導致一些潛在的問題,最明顯的問題比如:
- 在後臺
backend
上傳圖片後(例如:/uploads/pic01.jpg
),前臺frontend
無法直接訪問通過/uploads/pic01.jpg
這樣的相對路徑訪問,因為前後臺的域名是不一樣的。 - 在後臺的
Kindeditor
富文字框中新增了一些圖片或附件(例如:/uploads/img01.jpg
),那麼前臺frontend
也無法直接訪問通過/uploads/img01.jpg
這樣的相對路徑訪問,也是因為前後臺的域名是不一樣的。 - …
當然你可能有很多解決方案,比如前臺圖片顯示是增加後臺的域名、伺服器端設定 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=admin/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';
相關文章
- Git 子模組Git
- 聊聊Git subModule(子模組)Git
- git submodule 子模組應用Git
- git 子模組使用方法Git
- git 子模組使用小結Git
- SpringBoot + maven 父子模組專案搭建Spring BootMaven
- SpringBoot載入子模組配置檔案的方法Spring Boot
- maven如何快速更新子模組專案的版本號Maven
- CSS之盒子模型CSS模型
- Python之外掛模式(使用import_module匯入子模組)Python模式Import
- 如何在大型專案中使用Git子模組開發Git
- 手把手教你把 Git 子模組更新到主專案Git
- 盒子模型模型
- 基於Barra多因子模型的組合權重優化模型優化
- gitlab webhook 如何針對一個專案下的子模組配置GitlabWebHook
- 基於Barra多因子模型的組合權重最佳化模型
- CSS盒子模型CSS模型
- CSS 盒子模型CSS模型
- 多因子模型模型
- CSS 小結筆記之盒子模型CSS筆記模型
- 6. 盒子模型模型
- CSS盒子模型詳解CSS模型
- css學習-盒子模型CSS模型
- 關於 CSS 盒子模型CSS模型
- CSS佈局-盒子模型CSS模型
- 數位電子模擬實驗資料大全
- 【靜態頁面架構】CSS之盒子模型架構CSS模型
- 盒子模型Box Model簡介模型
- css實現盒子模型的各種居中方式CSS模型
- 手把手教你實現法瑪三因子模型模型
- Flutter 入門與實戰(二):容器的盒子模型Flutter模型
- css 盒子模型和position總結CSS模型
- JAVA單子模式(static 應用)Java模式
- 後臺管理系統CMS模組-後端實現後端
- 前後端分離後模組開發後端
- threejs+tweenjs實現3D粒子模型切換JS3D模型
- 總是記不住的css盒子模型CSS模型
- Html/CSS03(盒子模型傳參)HTMLCSS模型