用户
 找回密码
 入住 CI 中国社区
搜索
查看: 7473|回复: 5
收起左侧

[中级] CodeIgniter(CI)Matchbox使用【翻译】

  [复制链接]
发表于 2010-4-23 15:02:59 | 显示全部楼层 |阅读模式
本帖最后由 baiyuxiong 于 2010-4-23 15:04 编辑

英文原文:http://codeigniter.com/wiki/Matchbox/

Matchbox

当前版本:
RC2
论坛主题:
http://codeigniter.com/forums/viewthread/128084/
最后更新:
2009-09-18

Matchbox是一个CI的扩展库,可以把你的程序组织成很小的组件(模块)。这些模块有几个好处,最主要的一点就是可移植性。模块保存在它们自己的文件夹里,所以你只需要把模块复制到别的目录里,就可以在其它的程序中使用或者与其它用户分享。

Installation安装

如果你的CodeIgniter已经能运行,你已经满足了几个必备条件。所以,你现在只需要下载并解压Matchbox的最新版本到你的程序目录就可以了
下载 Matchbox RC2

为了测试安装是否成功,打开浏览器,输入URI
http://yoursite.com/pathto/index.php/matchbox/

如果你能看到Matchbox的主页,就说明安装成功了。

如果安装失败,查看文章末尾的疑难解答页。如果还没能解决你的问题,在论坛主题里提问吧。

Usage使用

安装Matchbox不影响你当前的程序,所以,在
APPPATH/controllers/里的任何控制器还和没安装Matchbox前一样运行正常。开始模块化你的程序前,你必须先创建一个模块。

Creating a module创建模块

APPPATH/modules/下创建一个新的文件夹来创建新的模块。举个例子,创建文件夹APPPATH/modules/my_new_module/
,将会创建一个叫做my_new_module的模块。

在这个文件夹里,为模块需要的每种资源都创建一个文件夹。你希望模块里有控制器,所有在module文件夹下创建一个“controllers’”文件夹。还要为配置文件夹(config)、辅助函数(helpers)、语言文件(languages)、类库(libraries)、模型(models)、插件(plugins)和视图(views)创建文件夹。你的module目录现在看起来跟application目录差不多了。

Controllers in modules模块中的控制器

你已经有了一个带controllers/
文件夹的模块目录了。现在,创建一个控制器并放在那里。幸运的是,模块控制器和平常的控制器一模一样。所以,如果你现在就想测试Matchbox,你可以放心的复制一个已存在的控制器到模块目录或者直接创建一个新的控制器。

通过http://example.com/index.php/MODULE-NAME/CONTROLLER-NAME/.可以访问到你的控制器。基本上,与访问平常的控制器的唯一不同之处就是,需要在控制器名称的前面添加了一个模块的名称。如果你只输入
http://example.com/index.php/MODULE-NAME/
而不写控制器名称的话,Matchbox将试图载入与模块名称相同的控制器(除非启用了严格模式strict mode这在下面解释)。这个默认的控制器也可以自己定义,这会在下面的部分讲到。

Resources in modules模块中的资源

当你需要从控制器中载入资源,如散文的标题(
essay topic?)或者辅助函数的时候,事情变的有意思了。如果资源放的同样的module文件夹或者application文件夹里,他们可以像平常一样的加载(除非启用了严格模式strict mode这在下面解释)。

但是,如果你需要从其它的模块中载入资源,你必须告诉Matchbox要去哪个模块里找。你可以在调用平时的load的时候,把模块名称做为最一个参数传进去。

$this->load->model('blog_model', '', FALSE, 'my_other_module');

或者,你可以在load函数前加前缀“module_“,这时,第一个参数是模块的名称。

$this->load->module_model('my_other_module', 'blog_model');

Configuration files in modules模块中的配置文件

你也可以在模块中定制自己的routes.phpautoload.php配置文件。复制CodeIgniter里的routes.phpautoload.phpmodulesconfig文件夹并按你的意愿修改就可以。

URI中只输入模块名称的时候,模块的routes.php里设置的default_controller
将会被使用,而不是与模块名称相同的控制器。所以,如果你访问http://example.com/index.php/MODULE-NAME/
,它会载入配置文件里设置的默认控制器。

当然,你也可以增加类似routes.php.的自定义routes

Configuration配置

通过编辑
application/config/matchbox.php
文件夹,你可以配置Matchbox的安装。这个文件夹包含三个可配置的选项,变量“strict”,“paths”数组和“callers”数组。下面解决这三个选项。

Module directories模块目录

默认情况下,模块放在
APPPATH/modules/文件夹。但是,这个也可以用matchbox配置文件中的paths配置选项来修改。所以,如果你希望模块既在application文件夹又在system文件夹,把配置选项改成下面这样:

$config['paths'] = array(APPPATH.'modules', BASEPATH.'modules');

Caller Detection调用者检测

这两段翻译的不知所云,英文原文留在这里了。

Matchbox is able todetermine where a certain load call originates from using backtraces. What thismeans, is that even your request starts in a regular controller, and thatcontroller loads a library in a module and that library attempts to load amodel, Matchbox will now that the calling library is located in a certainmodule and attempt to find the model accordingly.

利用回溯,Matchbox可以知道一个load调用来自哪里。这意思是说,你请求一个平常的控制器,而那个控制器载入了一个模块中的类库,同时,类库想载入一个模型。Matchbox知道调用的类库在特定的模块里,并试图找到相应的模型。

However, if you have, say, a custom view library that you call instead of theregular loading of views, and that library is located in your applicationfolder then if a module controller calls said library to load a view in thesame module, then Matchbox will think that the view is located in yourapplication directory, because the final view request comes from the customview library located in the application folder.

但是,比如说,你有一个自定义的视图库用来调用,而不是平时的载入视图。这个类库放在application文件夹里。如果一个模块控制器载入这个类库来加载视图,那么Matchbox认为,视图是在application目录里的,因为最终的view请求来自application目录里的视图库。

To remedy this, you canadd your custom view library the the
caller
configuration array inthe matchbox configuration file.

为了解决这个问题,你可以在matchbox配置文件的caller
数组中加入你的自定义视图库。

$config['callers'] = array(APPPATH.'libraries/Custom_view_lib.php');

Strict mode严格模式

Matchbox配置文件里,strict
可以是TRUEFALSE

默认情况下,严格模式是禁用的。这意味着,Matchbox在搜索控制器或其它资源的时候,会做一些另外的检测。例如,当URI只包含模块名称的时候,Matchbox会尝试找到一个和模块名称一样的控制器。重要的是,启用严格模式,$this->load->something只会搜索当前模块的资源(和system目录),而不搜索application目录。所有,如果一个模块的控制器需要载入application目录里的辅助函数时,需要像下面这样做:

$this->load->module_helper(APPPATH, 'some_helper')

需要开启严格模式的原因很简单,它可以提高程序的速度。所有,如果你想在开发的时候开启严格模式,检查你的代码并在产品中开启。

Troubleshooting疑难解答
我的 “Matchbox出错了: Unable to load the requested class: pledgie”

最新版本中已解决了这个问题. 请下载Matchbox的最新版本.


http://www.baiyuxiong.com/?p=310

评分

参与人数 2威望 +7 收起 理由
Hex + 5 精品文章
kissboa + 2 学习 谢谢

查看全部评分

发表于 2010-4-24 19:40:15 | 显示全部楼层
这么好的文章看完了,得鼎力支持下。
发表于 2011-3-28 17:17:37 | 显示全部楼层
好文章顶起来 呵呵
发表于 2011-11-14 13:34:12 | 显示全部楼层
HMVC?
发表于 2012-2-15 10:44:11 | 显示全部楼层
感觉就是HMVC
发表于 2012-6-26 15:23:01 | 显示全部楼层
弄了一天,也没有搞出来

本版积分规则