CakePHP 2.x CookBook 中文版 第五章 控制器 之 组件
为什么80%的码农都做不了架构师?>>>
组件
组件是在多个控制器中共享的逻辑包。如果你发现自己想要在控制器间复制粘贴某些东西时,你就应该考虑将一些功能包装在一个组件中了。
CakePHP 还配备了一套漂亮的、对你有用的核心组件:
- Security(安全)
- Sessions(会话)
- Access control lists(访问控制列表)
- Emails(电子邮件)
- Cookies
- Authentication(权限校验)
- Request handling(请求处理)
- Pagination(分页)
这些组件的详细信息都在各自的章节中。 现在,我们将向你展示如何建立你自己的组件。 创建组件可以保持控制器代码整洁,并且允许你在多个项目中重用代码。
配置组件
一些核心组件需要配置。需要配置的组件有 授权、 Cookie 和 电子邮件组件 等。 对于一般的组件,通常在$components 数组或者控制器的 beforeFilter 方法中进行配置:
class PostsController extends AppController { public $components = array( 'Auth' => array( 'authorize' => array('controller'), 'loginAction' => array('controller' => 'users', 'action' => 'login') ), 'Cookie' => array('name' => 'CookieMonster') );
这是使用 $components 数组配置组件的例子。所有的核心组件都允许使用这种方式进行配置。此外,你也可以在控制器的 beforeFilter() 方法中配置组件。 这种方式通常用在你需要将一个函数的结果赋与一个组件属性的情况下。上面的例子还可以表示成:
public function beforeFilter() { $this->Auth->authorize = array('controller'); $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); $this->Cookie->name = 'CookieMonster'; }
然而,也有这种可能:一个组件的特定配置选项要在控制器的 beforeFilter() 运行前设置。 最后,一些组件允许在$components 数组中设置配置选项:
public $components = array( 'DebugKit.Toolbar' => array('panels' => array('history', 'session')) );
通过查阅相关文档可以确定每个组件都提供哪些配置选项。
className 是一个公用的设置选项,你可以借此给组件起个别名。当你想要用自定义的实现替换 $this->Auth 或者其它公用组件时,这个选项非常有用。
// app/Controller/PostsController.php class PostsController extends AppController { public $components = array( 'Auth' => array( 'className' => 'MyAuth' ) ); } // app/Controller/Component/MyAuthComponent.php App::uses('AuthComponent', 'Controller/Component'); class MyAuthComponent extends AuthComponent { // Add your code to override the core AuthComponent }
上例的控制器中 $this->Auth 的别名为 MyAuthComponent 。
注解
在任何用到有别名的组件时,都要使用别名,包括在其它组件内引用。
使用组件
一旦你已经在控制器中包含了一些组件,用起来是非常简单的。在控制器中每个元件都以属性的方式使用。如果你已经在控制器中加载了 SessionComponent 和 the CookieComponent ,你就可以像下面这样访问它们:
class PostsController extends AppController { public $components = array('Session', 'Cookie'); public function delete() { if ($this->Post->delete($this->request->data('Post.id')) { $this->Session->setFlash('Post deleted.'); $this->redirect(array('action' => 'index')); } }
注解
由于以属性身份加入到控制器中的模型和组件共享相同的 ‘命名空间’,你需要确保不给组件和模型相同的命名。
运行中加载组件
你也许不需要所有的组件在每个控制器方法中都可用。 这种情况下,你可以在运行时使用 Component Collection 加载一个组件。 在控制器内部,你可以按如下方式进行:
$this->OneTimer = $this->Components->load('OneTimer'); $this->OneTimer->getTime();
组件回调
组件也提供一些请求生命周期回调,以允许它们延伸请求周期。 有关组件提供的回调的更详细信息,请参阅 组件 API。
创建组件
假定我们的线上应用程序需要在其不同部分运行一个复杂的数学操作。我们可以创建一个组件包装这个用在几个不同控制器中的共享逻辑。
第一步是新的组件文件和类。创建的文件为 /app/Controller/Component/MathComponent.php。其基本结构如下:
App::uses('Component', 'Controller'); class MathComponent extends Component { public function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; } }
注解
所有的组件必须继承 Component。否则就会引发一个异常。
在控制器中包含组件
一旦组件完成,就可以通过将组件名称放进控制器的 $components 数组的方式在应用程序控制器中使用它了(参见 “组件” 部分)。控制器将自动提供一个用组件命名的新属性,通过这个属性我们可以访问组件的实例:
/* 生成一个新的组件变量 $this->Math 和一个标准的 $this->Session */ public $components = array('Math', 'Session');
定义在 AppController 中的组件将与其它控制器中的组件合并。因此不需要二次定义相同的组件。
在控制器中包含组件时,你还可以定义一组参数传递给组件的构造函数。这些参数随后将被组件处理:
public $components = array( 'Math' => array( 'precision' => 2, 'randomGenerator' => 'srand' ), 'Session', 'Auth' );
这段代码将包含了 precision 和 randomGenerator 的数组作为第二个参数传递给了 MathComponent::__construct()。根据约定,任何在组件上被传递的公共属性也将拥有基于此设置的值。
在组件中使用其它组件
有时一个组件还需要使用其它组件。在这种情况下,你可以使用与在控制器中包含组件相同的方式,在一个组件中包含另一个组件 - 使用 ``$components` 变量:
// app/Controller/Component/CustomComponent.php App::uses('Component', 'Controller'); class CustomComponent extends Component { // the other component your component uses public $components = array('Existing'); public function initialize(Controller $controller) { $this->Existing->foo(); } public function bar() { // ... } } // app/Controller/Component/ExistingComponent.php App::uses('Component', 'Controller'); class ExistingComponent extends Component { public function foo() { // ... } }
组件 API
class Component
组件基类为通过 ComponentCollection 延迟加载其它组件以及处理公共设置提供了几个方法。它还为所有的组件回调提供了属性。
Component::__construct( ComponentCollection $collection, $settings = array())
组件基类构造函数。作为公共属性的所有 $settings 也将有与 settings 内设置的值匹配的值。
回调
Component::initialize( Controller $controller)
initialize 方法在控制器的 beforeFilter 方法之前被调用。
Component::startup( Controller $controller)
startup 方法在控制器的 beforeFilter 之后但在控制器执行当前动作处理之前被调用。
Component::beforeRender( Controller $controller)
beforeRender 方法在执行请求动作逻辑之后,控制器渲染视图和布局之前被调用。
Component::shutdown( Controller $controller)
shutdown 方法在输出传送给浏览器之前被调用。
Component::beforeRedirect( Controller $controller, $url, $status=null, $exit=true)
beforeRedirect 方法在控制器跳转方法被调用之后,所有其它方法调用之前被调用。如果这个方法返回假,将不再继续完成请求的转向。$url、$status 和 $exit 变量对于控制器方法的意义相同。你还能返回一个字符串,作为转向的 url,或者返回带有键 ‘url’ 的关联数组,此数组的 ‘status’ 和 ‘exit’ 元素是可选的。
转载于:https://my.oschina.net/lht007/blog/115893
CakePHP 2.x CookBook 中文版 第五章 控制器 之 组件相关推荐
- CakePHP 2.x CookBook 中文版 第五章 控制器 之 页面控制器
页面控制器 CakePHP 提供了一个默认的控制器 PagesController.php.这是提供静态内容的简单的可靠的控制器.你在安装完看到的主页就是使用这个控制器实现的. 如果你生成了视图文件 ...
- CakePHP 2.x CookBook 中文版 第五章 控制器 之 请求和响应对象
请求和响应对象 在 CakePHP 2.0 中请求和响应对象是新的.在之前的版本中,这些对象是用数组来表示的,相关的方法分散在RequestHandlerComponent.Router. Dispa ...
- CakePHP 2.x CookBook 中文版 第五章 控制器 之 脚手架
脚手架 应用程序脚手架是一种允许程序定义和创建具有建立.查询.更新和删除对象的应用程序的技巧.CakePHP的脚手架还允许程序员定义对象如何与其它对象交互,建立或断开它们的连接. 脚手架用于建立一个模 ...
- CakePHP 2.x CookBook 中文版 第五章 控制器
控制器 控制器是 MVC 中的 'C' .在应用了路由且正确的控制器被找到之后,控制器的动作(action)被调用.控制器将处理解释请求数据,确保正确的模型被调用,确保正确的输出或视图被渲染.控制器可 ...
- CakePHP 2.x CookBook 中文版 第三章 入门(三)
为什么80%的码农都做不了架构师?>>> 路由 多数情况下,CakePHP 的默认路由都能够很好地工作.对用户体验和搜索引擎兼容敏感的程序员将注意到 CakePHP 的 URL ...
- CakePHP 2.x CookBook 中文版 第六章 视图 之二
主题 主题可以使你快捷地切换页面的外观. 要使用主题,只需在控制器中指定主题名称: 1 class ExampleController extends AppController { 2 public ...
- CakePHP 2.x CookBook 中文版 第七章 模型 之 保存数据
保存数据 CakePHP 会为保存模型数据制作快照.准备保存的数据使用如下基本格式传递给模型的 save() 方法: 1 Array 2 ( 3 [ModelName] => Array 4 ( ...
- CakePHP 2.x CookBook 中文版 第六章 视图
视图 视图是 MVC 中的 V. 视图负责为请求生成指定的输出.常用的格式有 HTML.XML 或者 JSON,不过用户可以下载的流文件和 PDF 文件也可以由视图层提供. CakePHP 为多数常用 ...
- CakePHP 2.x CookBook 中文版 第四章 CakePHP 概述
CakePHP 概述 欢迎来到 CakePHP Cookbook,这是一本使用 CakePHP web 应用程序框架开发一块蛋糕的的手册! 本手册假定你了解 PHP,并且有面向对象编程(OOP)方面的 ...
最新文章
- oracle导出客户机使用us7a,导入 Oracle WORLD SAMPLE
- go map的定义和使用 键值对存储
- 字段中存在空值的问题测试
- 【MongoDB 工具篇】MongoDB Compass介绍与简单使用
- sendencpac文件能删吗_“手机刷短视频”躺赚?安装自动阅读文件,开机就能挣钱?靠谱吗?...
- java限流器_Smaphor(信号量)实现限流器
- java 装饰流_java装饰流的使用【转】
- delphi 读写文本文件
- win10卸载office2010的方法
- mysql 数据入库去重_MySQL中去重 distinct 的用法 ,数据库去重distinct
- 低通滤波器的设计与DSP实现
- 绝对估值法和相对估值法
- 数电(二)—分析/画逻辑电路图
- NDoc 用户指南(转)
- 描述性统计分析 | 直方图
- 阿里校招 数据分析师 笔试题
- 计算机表格数字整体加,excel表格整体数据加1怎么处理-怎样才可以在EXCEL表格的数字中全部加1??...
- ContentProvider基本使用初探
- 共享单车、公交车辆位置、地铁等50+个交通数据集
- 小功率隔离型DC/DC高压电源模块