模組

模組是什麼?

模組是一組獨立的 MVC 元素。使用模組能讓你的程式碼有可重複使用性及封裝。 模組通常駐留在應用程式名為 modules 的子目錄中。 建議你可充分利用模組,每當在大型專案工作時, 且你相信該專案程式碼庫將不僅僅是幾行程式碼。 這將幫助你保持事物的整齊。

模組可以獨立運作,例如像 blog 模組或相簿模組。你可以直接路由到模組控制器,而不須存取任何全域的程式碼。 模組也可被用於一個真正的 HMVC 情境,控制器呼叫其他控制器,它將產生(一部分的)產生頁面請求所需的結果。

模組配置

為了能夠使用模組,你必須告訴 Fuel 你的模組處存在哪裡。 預設情況下,這在你應用程式的 modules 文件夾中。你使用在你應用程式 config.php 檔案的 'modules_path' 設定來定義你的模組路徑。 你也可以定義多個路徑。如果你這麼做,它們將在你已定義的序列中被搜尋。

/**
 * To enable you to split up your application into modules which can be
 * routed by the first uri segment you have to define their basepaths
 * here.
 */
'module_paths' => array(
	APPPATH.'modules'.DS,		// 指向應用程式模組
	APPPATH.'..'.DS.'globalmods'.DS	// 指向我們的全域模組
),

當你定義你的路徑時,確認它們以 DS 結尾,DS 是 Fuel 平台獨立的目錄分隔符。

模組命名空間

有一個經常遇到的問題,在與獨立開發的程式碼運作時,類別名稱碰撞。例如,有很多的模組有一個 admin 控制器。為了避免碰撞,在 Fuel 中每個模組都住在自己的 PHP 命名空間,它必須被命名與該模組文件夾名稱一致。

<?php
/**
 * 在 Mymodule 裡的模組控制器
 */

namespace Mymodule;

class Controller_Widget
{

	// 在這裡放你的控制器程式碼,就像一個應用程式的控制器
}

如果你已經移動你的控制器到一個像是這裡解釋的命名空間中。 你必須為你的模組控制器使用相同設置。在這個例子中,命名空間會是 Mymodule\Controller、類別名稱是 Widget

模組文件夾結構

你可以透過在你已定義在配置的模組文件夾中,為你的新模組建立一個文件夾,來開始建立一個模組。 文件夾名稱決定模組名稱,以及給在模組中類別命名空間的名稱。 這個名稱也被用在你希望路由到模組控制的 URI,或做為一個 HMVC 呼叫情況下的 Request 的一部份。

做為一個模組可被視為一個應用程式自身包含的部分,你會注意到模組文件夾結構十分熟悉。 這與應用程式文件夾的結構是相同的。以下是模組支援的文件夾結構:

跨模組載入檔案

無論它是一個配置文件,或一個跨模組載入的檢視文件, 都必須在檔案名稱有模組前綴:

// 跨模組載入一個配置
\Config::load('othermodule::myconfig');

// 跨模組載入一個檢視
\View::forge('othermodule::subdir/view');

從模組運行一個任務:

$ php oil refine <modulename>::<taskname>:<methodname>

模組路由

當你在路由模式下使用模組,你可以透過包含一個在你模組 config 文件夾中的 routes.php 來添加自訂路由到你的模組。 這些路由將被載入當 Fuel 偵測到第一個 URI 分段指的是一個模組,而且只有該模組的路由會被載入。 這些路由將被附加到路由陣列前面,所以一個在主要路由配置中可能的 (:any) 路由在模組路由處理之前將不會配對。

這暗示著模組路由不能被用來定義給全域或給其他模組的路由。 換言之,左側應始終包含目前模組做為第一個 URI 分段。 右側你可以使用以上段落所述的任何東西, 讓一個模組路由到一個應用程式控制器或其他模組是完全沒有問題的。

模組與 HMVC 請求

除了使用模組做為分離應用程式獨立邏輯的部分, 你也可以在一個 HMVC 情境下使用模組控制器,你應用程式的控制器其中之一, 呼叫更多模組控制器來建立 URI 請求的最終結果。

閱讀 HMVC 請求文件了解更多資訊。

在模組外使用模組類別

在模組外使用一個模組的類別當然也是可能的。 要讓它運作,Fuel 需要能夠自動載入該類別當你在你的程式碼中引用它。 這意味著你將必須告訴 Fuel 要在哪裡找到該模組。有兩種方法可以做到。

你可以預先載入模組透過在你應用程式的 config.php 檔案中的 'always_load''modules' 設定來指定要載入的模組:

'always_load' => array(

	/**
	 * These modules are always loaded on Fuel's startup. You can specify them
	 * in the following manner:
	 *
	 * array('module_name');
	 *
	 * A path must be set in module_paths for this to work.
	 */
	'modules'	=> array('mymodule'),

你也可以在執行階段手動添加模組,在你使用任何靜態方法之前:

// 使 Mymodule 模組可存取
Module::load('mymodule');

然後像這樣呼叫模組類別:

\Mymodule\Myclass::mymethod('params');