> CakePHP中文手册 > Component组件

Component(组件)

Section 1 简介

Component是用来在特定的场景下帮助controller更好的完成业务。与其扩展一些Cake的核心类库,反而不如写一个Component,因为一些特殊的方法可以被加入到Component中。

IRC频道中有一位olle同学有次这么描述Component:Component就是一个可以被共享的"controllerette",也就是说是一个精简版的可以重用的controller。我们觉得是一个非常不错的定义。Component最主要的目标就是:重用性。Component是面向Controller的,就像Helper是面向View的一样。两者最明显的差别在于Component缩减了业务逻辑,而Helper则缩减了表现层逻辑。这是非常重要的一点,我相信很多入门者都有着同样的困扰,当他想做一件事情,为了使之能够被重用,是该写成一个Component还是一个Helper呢?答案非常的简单,你是用来做什么事情呢?是完成某个业务逻辑还是某个表现层逻辑,或者是两者皆有?如果是业务逻辑,那答案就是Component,如果是表现层逻辑,显然就该是一个Helper。如果两者皆有,那只好写两个了,记住解耦是我们写程序最重要的地方之一。后面章节中,验证模块会就此做出示范。你需要登陆,注销,限制访问,资源访问权限(比如对 aciton 或者 url 的访问权限),这些都是业务逻辑,所以应该是一个Component。但是你肯定也需要一些页面上主菜单的入口共用户登陆用,这就是表现层逻辑。不要混淆二者。

Section 2 自己动手来创建一个Component

在app/controllers/components/路径下创建一个文件是第一步。
我们假设已经创建了foo.PHP。然后我们在文件中定义我们的Component,该类名应该为文件名加上 'Component' 的后缀,如下所示:

当使用该Component时,你需要添加下面的代码到controller定义中去:
var $components = array('Foo');

然后如下这般调用:
$this->Foo->doFoo();

一个Component访问调用它的Controller一般是通过Component自己的startup()方法来实现的。这个方法会在Controller::beforeFilter()之后立即被执行。所以如果希望设置Component的一些属性,beforeFilter是最佳的场所。

如果希望在Component中使用model,你可以创建一个新的Component实例:
$foo =& new Foo();

你也可以在一个Component中使用其它的Component。如下所示,你可以非常简单的声明其它的Component。
var $components = array('session');

Section 3 开源你的Component

如果你觉得你的Component对大家都会有些帮助,请把加到 CakeForge 上去。如果对社区有帮助,我们会考虑把它集成到Core类库里面去。

你可以查看 snippet archive 获取其它用户提交的Component。

上一篇:
下一篇: