模組

模組是什么?

模組是一組獨立的 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');