热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CakePHP2.xCookBook中文版第五章控制器之组件

beforeRedirect方法在控制器跳转方法被调用之后,所有其它方法调用之前被调用。如果这个方法返回假,将不再继续完成请求的转向。$url、$status和$exit变量对于控制器方法的意义相同。你还能返回一个字符串,作为转向的url,或者返回带有键‘url’的关联数组,此数组的‘status’和

组件

组件是在多个控制器中共享的逻辑包。如果发现自己想要在控制器间复制粘贴某些东西时,你就应该考虑将一些功能包装在一个组件中了。

CakePHP 还配备了一套漂亮的、对你有用的核心组件:

  • Security(安全)
  • Sessions(会话)
  • Access control lists(访问控制列表)
  • Emails(电子邮件)
  • COOKIEs
  • Authentication(权限校验)
  • Request handling(请求处理)
  • Pagination(分页)

这些组件的详细信息都在各自的章节中。 现在,我们将向你展示如何建立你自己的组件。 创建组件可以保持控制器代码整洁,并且允许你在多个项目中重用代码。

配置组件

一些核心组件需要配置。需要配置的组件有 授权、 COOKIE 和 电子邮件组件 等。 对于一般的组件,通常在$components 数组或者控制器的 beforeFilter 方法中进行配置:

1 class PostsController extends AppController { 2 public $compOnents= array( 3 'Auth' => array( 4 'authorize' => array('controller'), 5 'loginAction' => array('controller' => 'users', 'action' => 'login') 6 ), 7 'COOKIE' => array('name' => 'COOKIEMonster') 8 );

这是使用 $components 数组配置组件的例子。所有的核心组件都允许使用这种方式进行配置。此外,你也可以在控制器的 beforeFilter() 方法中配置组件。 这种方式通常用在你需要将一个函数的结果赋与一个组件属性的情况下。上面的例子还可以表示成:

1 public function beforeFilter() { 2 $this->Auth->authorize = array('controller'); 3 $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 4 5 $this->COOKIE->name = 'COOKIEMonster'; 6 }

然而,也有这种可能:一个组件的特定配置选项要在控制器的 beforeFilter() 运行前设置。 最后,一些组件允许在$components 数组中设置配置选项:

1 public $compOnents= array( 2 'DebugKit.Toolbar' => array('panels' => array('history', 'session')) 3 );

通过查阅相关文档可以确定每个组件都提供哪些配置选项。

className 是一个公用的设置选项,你可以借此给组件起个别名。当你想要用自定义的实现替换 $this->Auth 或者其它公用组件时,这个选项非常有用。

 1 // app/Controller/PostsController.php  2 class PostsController extends AppController {  3 public $compOnents= array(  4 'Auth' => array(  5 'className' => 'MyAuth'  6 )  7 );  8 }  9 10 // app/Controller/Component/MyAuthComponent.php 11 App::uses('AuthComponent', 'Controller/Component'); 12 class MyAuthComponent extends AuthComponent { 13 // Add your code to override the core AuthComponent 14 }

上例的控制器中 $this->Auth 的别名为 MyAuthComponent 。

注解

在任何用到有别名的组件时,都要使用别名,包括在其它组件内引用。

使用组件

一旦你已经在控制器中包含了一些组件,用起来是非常简单的。在控制器中每个元件都以属性的方式使用。如果你已经在控制器中加载了 SessionComponent 和 the COOKIEComponent ,你就可以像下面这样访问它们:

1 class PostsController extends AppController { 2 public $compOnents= array('Session', 'COOKIE'); 3 4 public function delete() { 5 if ($this->Post->delete($this->request->data('Post.id')) { 6 $this->Session->setFlash('Post deleted.'); 7 $this->redirect(array('action' => 'index')); 8  } 9 }

注解

由于以属性身份加入到控制器中的模型和组件共享相同的 ‘命名空间’,你需要确保不给组件和模型相同的命名。

运行中加载组件

你也许不需要所有的组件在每个控制器方法中都可用。 这种情况下,你可以在运行时使用 Component Collection 加载一个组件。 在控制器内部,你可以按如下方式进行:

1 $this->OneTimer= $this->Components->load('OneTimer'); 2 $this->OneTimer->getTime();

组件回调

组件也提供一些请求生命周期回调,以允许它们延伸请求周期。 有关组件提供的回调的更详细信息,请参阅 组件 API

创建组件

假定我们的线上应用程序需要在其不同部分运行一个复杂的数学操作。我们可以创建一个组件包装这个用在几个不同控制器中的共享逻辑。

第一步是新的组件文件和类。创建的文件为 /app/Controller/Component/MathComponent.php。其基本结构如下:

1 App::uses('Component', 'Controller'); 2 class MathComponent extends Component { 3 public function doComplexOperation($amount1, $amount2) { 4 return $amount1 + $amount2; 5  } 6 }

注解

所有的组件必须继承 Component。否则就会引发一个异常。

在控制器中包含组件

一旦组件完成,就可以通过将组件名称放进控制器的 $components 数组的方式在应用程序控制器中使用它了(参见 “组件” 部分)。控制器将自动提供一个用组件命名的新属性,通过这个属性我们可以访问组件的实例:

1 /* 生成一个新的组件变量 $this->Math 2 和一个标准的 $this->Session */ 3 public $compOnents= array('Math', 'Session');

定义在 AppController 中的组件将与其它控制器中的组件合并。因此不需要二次定义相同的组件。

在控制器中包含组件时,你还可以定义一组参数传递给组件的构造函数。这些参数随后将被组件处理:

1 public $compOnents= array( 2 'Math' => array( 3 'precision' => 2, 4 'randomGenerator' => 'srand' 5 ), 6 'Session', 'Auth' 7 );

这段代码将包含了 precision 和 randomGenerator 的数组作为第二个参数传递给了 MathComponent::__construct()。根据约定,任何在组件上被传递的公共属性也将拥有基于此设置的值。

在组件中使用其它组件

有时一个组件还需要使用其它组件。在这种情况下,你可以使用与在控制器中包含组件相同的方式,在一个组件中包含另一个组件 - 使用 ``$components` 变量:

 1 // app/Controller/Component/CustomComponent.php  2 App::uses('Component', 'Controller');  3 class CustomComponent extends Component {  4 // the other component your component uses  5 public $compOnents= array('Existing');  6  7 public function initialize(Controller $controller) {  8 $this->Existing->foo();  9  } 10 11 public function bar() { 12 // ... 13  } 14 } 15 16 // app/Controller/Component/ExistingComponent.php 17 App::uses('Component', 'Controller'); 18 class ExistingComponent extends Component { 19 20 public function foo() { 21 // ... 22  } 23 }

组件 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’ 元素是可选的。


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 1函数1.1函数的定义  设xxx和yyy是两个变量,D,icod ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
author-avatar
记忆的旅行者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有