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';
相關文章
- 前端工程-從原理到輪子之JS模組化前端JS
- UE4 在當前遊戲模組新增一個新的模組遊戲
- 前後端分離後模組開發後端
- 後臺管理系統CMS模組-後端實現後端
- Node實踐 --- http 模組HTTP
- Python模組學習:subprocess 建立子程式Python
- ASP.NET Core模組化前後端分離快速開發框架介紹之4、模組化實現思路ASP.NET後端框架
- onthink新增模組
- 新增表單請求後鉤子
- lerna管理前端模組實踐前端
- iOS模組化探索實踐iOS
- Laravel 專案模組化管理和子域名配置Laravel
- 由ASP.NET所謂前臺呼叫後臺、後臺呼叫前臺想到HTTP——實踐篇(一)ASP.NETHTTP
- 由ASP.NET所謂前臺呼叫後臺、後臺呼叫前臺想到HTTP——實踐篇(二)ASP.NETHTTP
- Yii2 log 模組,訊息日誌
- Nginx 新增 lua 模組Nginx
- 為 Nginx 新增模組Nginx
- Docker 映象新增模組Docker
- apache新增php模組ApachePHP
- 如何繫結多個後臺模組
- maven最佳實踐:劃分模組Maven
- SimplCommerce: 超簡單、跨平臺、模組化的電子商務系統
- 完整的智慧物聯中臺應該具備哪些子產品和模組呢?
- 查詢自己機子上是否有某一Perl模組
- python模組之collections模組Python
- 【MySQL】子查詢之一MySql
- 怎麼讓後臺模組支援httpsHTTP
- Android模組化開發實踐Android
- 前端多專案模組化實踐前端
- Android 模組化探索與實踐Android
- 6657子卡模組設計資料原理圖第268篇:基於FMC介面的DSP TMS320C6657子卡模組S3
- 極簡實用的Asp.NetCore模組化框架新增CMS模組ASP.NETNetCore框架
- ASP.NET Core模組化前後端分離快速開發框架介紹之2、快速建立一個業務模組ASP.NET後端框架
- 基於 ThinkPHP6 開發的模組化前後臺分離管理系統PHP
- 中國銀行電子支付平臺建設探索與實踐
- Python模組之urllib模組Python
- 模組學習之hashlib模組
- yii2配置詞典 / 模組(module)配置一覽