Yii2 之 frontend 子模組實踐之一:新增前後臺子模組

外來物種發表於2020-12-05

▪ 環境

基於 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 這樣的相對路徑訪問,也是因為前後臺的域名是不一樣的。

當然你可能有很多解決方案,比如前臺圖片顯示是增加後臺的域名、伺服器端設定 alias 訪問 /uploads、使用類似阿里雲OSS物件儲存等等。

但是這些修改真的挺麻煩,我就開發一個小專案,我就想後臺上傳了就前臺直接能訪問,完全不想弄那麼繁瑣的配置,而 Yii2 的模組 Modules 功能就能很好的解決這個問題。

▪ Yii2 模組介紹

關於 Yii2 的模組(Modules),你可以參閱 官方手冊 進行了解。

其實高階模板中 frontendbackend 也可以理解為模組,但是他們可以單獨部署(可以繫結獨立的域名),所以他們又是高階模組(官方稱之為應用主體),是所有其它自定義模組的根級別的父模組。

Yii2 的模組設計是可以無限巢狀的,但是預設安裝完後,每個 應用主體 下面只有一個主模組,其 MVC 目錄結構直接位於應用的根目錄下。

利用 Yii2 的模組可以巢狀功能,我們可以在 frontend 這個 應用主體 下建立兩個子模組index(前臺) 和 admin(後臺)
,這樣前臺和後臺都是在同一個域名下(frontend.domain.com),這樣就完美解決了文章開頭所講的問題了。

當然,因為後臺以 子模組 的形式嵌入到 frontend 內了,那麼系統自動建立 backend 就無用武之地。

▪ Yii2 模組程式碼

假定 frontend 應用主體繫結的域名為 frontend.domain.com,同時我們需要在 frontend 下面新增 indexadmin 兩個子模組,操作如下:

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,開啟的頁面沒有任何變化,這說明了現在應用主體還是訪問之前預設的主模組,那如何才能訪問到 indexadmin 子模組

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';

相關文章