模組 - 一般
模组是什幺?
模组是一组独立的 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 的一部份。
做为一个模组可被视为一个应用程序自身包含的部分,你会注意到模组文件夹结构十分熟悉。 这与应用程序文件夹的结构是相同的。以下是模组支援的文件夹结构:
- classes
- controller
- model
- view
- config
- lang
- tasks
- views
跨模组载入档案
无论它是一个配置文件,或一个跨模组载入的检视文件, 都必须在档案名称有模组前缀:
// 跨模组载入一个配置
\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');