首頁 後端開發 php教程 Yii2.0— 模組

Yii2.0— 模組

Nov 25, 2016 pm 02:09 PM
yii 模組

模組是獨立的軟體單元,由模型, 視圖, 控制器和其他支援元件組成, 終端使用者可以存取在應用主體中已安裝的模組的控制器, 模組被當成小應用主體來看待,和應用主體不同的是, 模組不能單獨部署,必須屬於某個應用程式主體。

創建模組

模組被組織成一個稱為[[yiibaseModule::basePath|base path]]的目錄, 在該目錄中有子目錄如controllers,models,views分別為對應控制器,模型,視圖和其他代碼,和應用非常類似。 如下範例顯示一個模型的目錄結構:

forum/
    Module.php                   模块类文件
    controllers/                 包含控制器类文件
        DefaultController.php    default 控制器类文件
    models/                      包含模型类文件
    views/                       包含控制器视图文件和布局文件
        layouts/                 包含布局文件
        default/                 包含DefaultController控制器视图文件
            index.php            index视图文件
登入後複製

模組類

每個模組都有一個繼承[[yiibaseModule]]的模組類,該類文件直接放在模組的[[yiibaseModule::basePath|base path] ]目錄下, 並且能自動載入。當一個模組被訪問,和 應用主體實例 類似會創建該模組類別唯一實例,模組實例用來幫模組內程式碼共享資料和組件。

以下範例一個模組類別大致定義:

namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this->params['foo'] = 'bar'; 
// ...  其他初始化代码 ... } }
登入後複製

如果init()方法包含很多初始化模組屬性程式碼,可將他們保存在設定並在init()中使用以下程式碼載入:

public function init() { parent::init(); // 从config.php加载配置来初始化模块 \Yii::configure($this, require(__DIR__ . '/config.php')); }
登入後複製

config.php設定檔可能包含以下內容,類似應用主體配置.

<?php return [ &#39;components&#39; => [ // list of component configurations ], &#39;params&#39; => [ // list of parameters ], ];
登入後複製

模組中的控制器

創建模組的控制器時,慣例是將控制器類別放在模組類命名空間的controllers子命名空間中, 也意味著要將控制器類別檔案放在模組[[yiibaseModule::basePath|base path]]目錄中的controllers子目錄中。 例如,上小節要在forum模組中建立post控制器,應像如下申明控制器類別:

namespace app\modules\forum\controllers; use yii\web\Controller; class PostController extends Controller { // ... }
登入後複製

可設定[[yiibaseModule::controllerNamespace]]屬性來自訂控制器類別的命名空間, 如果某些控制器不再該命名空間下,可配置[[yiibaseModule::controllerMap]]屬性讓它們能被訪問, 這類似於應用主體配置所做的。

模組中的視圖

視圖應放在模組的[[yiibaseModule::basePath|base path]]對應目錄下的views目錄, 模組中控制器對應的視圖檔案應放在views/ControllerID目錄下,其中ControllerID對應控制器ID. For example, if 例如,假定控制器類別為PostController,目錄對應模組[[yiibaseModule::basePath|base path]]目錄下的views/post目錄。

模組可指定 佈局,它用在模組的控制器視圖渲染。 佈局檔案預設放在views/layouts目錄下,可設定[[yiibaseModule::layout]]屬性指定佈局名, 如果沒有配置layout屬性名,預設會使用套用的佈局。

使用模組

要在應用程式中使用模組,只需要將模組加入到應用程式主體設定的[[yiibaseApplication::modules|modules]]屬性的清單中, 如下程式碼的應用程式主體設定使用forum模組:

[ &#39;modules&#39; => [ &#39;forum&#39; => [ &#39;class&#39; => &#39;app\modules\forum\Module&#39;, // ... 模块其他配置 ... ], ], ]
登入後複製

[[yiibaseApplication::modules|modules]] 屬性使用模組配置數組,每個數組鍵為模組ID, 它標識該應用程式中唯一的模組,數組的值為用來創建模組的配置。

路由

和存取應用的控制器類似,路由 也用在模組中控制器的尋址, 模組中控制器的路由必須以模組ID開始,接下來為控制器ID和操作ID。 例如,假設應用程式使用一個名為forum模組,路由forum/post/index代表模組中post控制器的index操作, 如果路由只包含模組ID,預設為default的[[yiibaseModule::defaultRoute]] 屬性來決定使用哪個控制器/操作, 也就是說路由forum可能代表forum模組的default控制器。

存取模組

在模組中,可能經常需要取得模組類別的實例來存取模組ID,模組參數,模組元件等, 可以使用如下語句來取得:

$module = MyModuleClass::getInstance();
登入後複製

其中MyModuleClass對應你想要的模組類, getInstance()方法傳回目前要求的模組類實例, 如果模組沒有被要求,方法會傳回空,注意不需要手動建立一個模組類,因為手動建立的和Yii處理請求時自動建立的不同。

補充: 當開發模組時,你不能假定模組使用固定的ID,因為在應用或其他沒模組中,模組可能會對應到任意的ID, 為了獲取模組ID,應使用上述程式碼取得模組實例,然後透過$module->id取得模組ID。

也可以使用以下方式存取模組實例:

// 获取ID为 "forum" 的模块 $module = \Yii::$app->getModule('forum'); // 获取处理当前请求控制器所属的模块 $module = \Yii::$app->controller->module;

第一种方式仅在你知道模块ID的情况下有效,第二种方式在你知道处理请求的控制器下使用。

一旦获取到模块实例,可访问注册到模块的参数和组件,例如:

$maxPostCount = $module->params[&#39;maxPostCount&#39;];
登入後複製

引导启动模块

有些模块在每个请求下都有运行, [[yii\debug\Module|debug]] 模块就是这种, 为此将这种模块加入到应用主体的 [[yii\base\Application::bootstrap|bootstrap]] 属性中。

例如,如下示例的应用主体配置会确保debug模块每次都被加载:

[ &#39;bootstrap&#39; => [ &#39;debug&#39;, ], &#39;modules&#39; => [ &#39;debug&#39; => &#39;yii\debug\Module&#39;, ], ]
登入後複製

模块嵌套

模块可无限级嵌套,也就是说,模块可以包含另一个包含模块的模块,我们称前者为父模块,后者为子模块, 子模块必须在父模块的[[yii\base\Module::modules|modules]]属性中申明,例如:

namespace app\modules\forum; class Module extends \yii\base\Module { public function init() { parent::init(); $this->modules = [ &#39;admin&#39; => [ 
// 此处应考虑使用一个更短的命名空间 &#39;class&#39; => &#39;app\modules\forum\modules\admin\Module&#39;, ], ]; } }
登入後複製

在嵌套模块中的控制器,它的路由应包含它所有祖先模块的ID,例如forum/admin/dashboard/index代表 在模块forum中子模块admin中dashboard控制器的index操作。

最佳实践

模块在大型项目中常备使用,这些项目的特性可分组,每个组包含一些强相关的特性, 每个特性组可以做成一个模块由特定的开发人员和开发组来开发和维护。

在特性组上,使用模块也是重用代码的好方式,一些常用特性,如用户管理,评论管理,可以开发成模块, 这样在相关项目中非常容易被重用。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1252
24
WLAN擴充模組已停止[修復] WLAN擴充模組已停止[修復] Feb 19, 2024 pm 02:18 PM

如果您的Windows電腦上的WLAN擴充模組出現問題,可能會導致您與網際網路中斷連線。這種情況常常讓人感到困擾,但幸運的是,本文提供了一些簡單的建議,可以幫助您解決這個問題,讓您的無線連線重新正常運作。修復WLAN擴充模組已停止如果您的Windows電腦上的WLAN可擴充性模組已停止運作,請依照下列建議進行修復:執行網路和Internet故障排除程式停用並重新啟用無線網路連線重新啟動WLAN自動設定服務修改電源選項修改高級電源設定重新安裝網路適配器驅動程式運行一些網路命令現在,讓我們來詳細看

WLAN可擴充性模組無法啟動 WLAN可擴充性模組無法啟動 Feb 19, 2024 pm 05:09 PM

本文詳細介紹了解決事件ID10000的方法,該事件表明無線區域網路擴充模組無法啟動。在Windows11/10PC的事件日誌中可能會顯示此錯誤。 WLAN可擴充性模組是Windows的一個元件,允許獨立硬體供應商(IHV)和獨立軟體供應商(ISV)為使用者提供客製化的無線網路特性和功能。它透過增加Windows預設功能來擴充本機Windows網路元件的功能。在作業系統載入網路元件時,WLAN可擴充性模組會作為初始化的一部分啟動。如果無線區域網路擴充模組遇到問題無法啟動,您可能會在事件檢視器的日誌中看到錯誤消

Python常用標準函式庫及第三方函式庫2-sys模組 Python常用標準函式庫及第三方函式庫2-sys模組 Apr 10, 2023 pm 02:56 PM

一、sys模組簡介前面介紹的os模組主要面向作業系統,而本篇的sys模組則主要針對的是Python解釋器。 sys模組是Python自帶的模組,它是與Python解釋器互動的一個介面。 sys 模組提供了許多函數和變數來處理 Python 執行環境的不同部分。二、sys模組常用方法透過dir()方法可以查看sys模組中帶有哪些方法:import sys print(dir(sys))1.sys.argv-取得命令列參數sys.argv作用是實作從程式外部向程式傳遞參數,它能夠取得命令列參數列

Python 的 import 是怎麼運作的? Python 的 import 是怎麼運作的? May 15, 2023 pm 08:13 PM

你好,我是somenzz,可以叫我徵哥。 Python的import是非常直覺的,但即使這樣,有時你會發現,明明套件就在那裡,我們仍會遇到ModuleNotFoundError,明明相對路徑非常正確,就是報錯ImportError:attemptedrelativeimportwithnoknownparentpackage導入同一個目錄的模組和不同的目錄的模組是完全不同的,本文透過分析使用import經常遇到的一些問題,來幫助你輕鬆搞定import,據此,你可以輕鬆創建屬

Python程式設計:詳解命名元組(namedtuple)的使用要點 Python程式設計:詳解命名元組(namedtuple)的使用要點 Apr 11, 2023 pm 09:22 PM

前言本文繼續來介紹Python集合模組,這次主要簡明扼要的介紹其內的命名元組,即namedtuple的使用。閒話少敘,我們開始-記得按讚、追蹤和轉發哦~ ^_^創建命名元組Python集合中的命名元組類namedTuples為元組中的每個位置賦予意義,並增強代碼的可讀性和描述性。它們可以在任何使用常規元組的地方使用,並且增加了透過名稱而不是位置索引方式存取欄位的能力。其來自Python內建模組collections。其使用的常規語法方式為:import collections XxNamedT

Ansible運作方式詳解 Ansible運作方式詳解 Feb 18, 2024 pm 05:40 PM

Ansible工作原理從上面的圖可以了解到:管理端支援local、ssh、zeromq三種方式連接被管理端,預設使用基於ssh的連接,這部分對應上面架構圖中的連接模組;可以按應用類型等方式進行HostInventory(主機清單)分類,管理節點透過各類模組實現對應的操作,單一模組,單一指令的批次執行,我們可以稱為ad-hoc;管理節點可以透過playbooks實作多個task的集合實作一類功能,如web服務的安裝部署、資料庫伺服器的批次備份等。 playbooks我們可以簡單的理解為,系統透過

如何在 Python 中使用 DateTime 如何在 Python 中使用 DateTime Apr 19, 2023 pm 11:55 PM

所有資料在開始時都會自動分配一個「DOB」(出生日期)。因此,在某些時候處理資料時不可避免地會遇到日期和時間資料。本教學將帶您了解Python中的datetime模組以及使用一些外圍函式庫,如pandas和pytz。在Python中,任何與日期和時間有關的事情都由datetime模組處理,它將模組進一步分為5個不同的類別。類別只是與物件相對應的資料類型。下圖總結了Python中的5個日期時間類別以及常用的屬性和範例。 3個有用的片段1.將字串轉換為日期時間格式,也許是使用datet

Yii2 vs Phalcon:哪個框架更適合開發顯示卡渲染應用? Yii2 vs Phalcon:哪個框架更適合開發顯示卡渲染應用? Jun 19, 2023 am 08:09 AM

在當前資訊時代,大數據、人工智慧、雲端運算等技術已成為了各大企業關注的熱點。在這些技術中,顯示卡渲染技術作為一種高效能圖形處理技術,受到了越來越多的關注。顯示卡渲染技術廣泛應用於遊戲開發、影視特效、工程建模等領域。而對於開發者來說,選擇一個適合自己專案的框架,是一個非常重要的決策。在目前的語言中,PHP是一種相當有活力的語言,一些優秀的PHP框架如Yii2、Ph

See all articles