热门标签 | 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’ 元素是可选的。


推荐阅读
  • 本文汇集了使用C#中不同HTTP客户端向Web API上传文件的实例,旨在为开发者提供实用的技术指南。 ... [详细]
  • 本文详细介绍了在PHP中如何创建新文件以及如何使自定义函数在整个项目中全局可用的方法,包括最新的实践技巧。 ... [详细]
  • 解决phpMyAdmin运行错误:mysqli_init(): 属性访问尚未允许
    本文探讨了在使用phpMyAdmin过程中遇到的mysqli_init()函数错误,并提供了有效的解决方案。 ... [详细]
  • 本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ... [详细]
  • Linux 文件系统结构详解
    本文详细介绍了Linux操作系统的文件系统结构,包括其独特的树状目录体系、根目录的作用、目录与磁盘分区的关系等,并对各主要目录的功能进行了深入解析。 ... [详细]
  • 本文详细记录了《PHP与MySQL Web开发》第一章的学习心得,特别关注了PHP的基本构成元素、标记风格、编程注意事项及表单处理技巧等内容。 ... [详细]
  • 致信息安全爱好者的成长指南
    本文旨在为信息安全爱好者提供一份详尽的成长指南,涵盖从学习心态调整到具体技能提升的各个方面。 ... [详细]
  • 基于函数实现的进制转换工具
    本文介绍了一种利用函数实现不同进制数(二进制、八进制、十进制)之间转换的方法。包括了程序的运行效果展示、所使用的主要函数解析、以及如何验证用户输入的合法性。整个项目仅使用了两个全局变量来存储用户的选项和输入的数值。 ... [详细]
  • 深入解析RAID0、RAID1和RAID5的不同特性及其安全性
    本文详细探讨了RAID0、RAID1和RAID5三种磁盘阵列技术的特点、优势以及它们在数据安全方面的表现。RAID0通过数据条带化提升性能,但牺牲了数据冗余;RAID1利用镜像技术确保数据的高可用性;而RAID5则结合了数据条带化和分布式奇偶校验,提供了较好的性能和数据保护。 ... [详细]
  • 本文介绍了EasyTrac 0.1.0.11b1版本的发布,这是一个简化Trac部署过程的工具,特别适合于希望快速搭建项目管理和问题跟踪系统的用户。 ... [详细]
  • 本文详细介绍了在Oracle Data Guard中配置Standby Redo Log的方法,包括其重要性和具体的配置步骤。通过本文的学习,您将能够掌握如何有效地设置Standby Redo Log以提高数据保护和系统可用性。 ... [详细]
  • 本文详细介绍了如何对路由器进行重置及基本设置,包括恢复出厂设置、登录路由器管理界面、设置上网方式以及配置无线网络。 ... [详细]
  • 应用程序配置详解
    本文介绍了配置文件的关键特性及其在不同场景下的应用,重点探讨了Machine.Config和Web.Config两种主要配置文件的用途和配置方法。文章还详细解释了如何利用XML格式的配置文件来调整应用程序的行为,包括自定义配置、错误处理、身份验证和授权设置。 ... [详细]
  • 解决getallheaders函数导致的500错误及8种服务器性能优化策略
    本文探讨了解决getallheaders函数引起的服务器500错误的方法,并介绍八种有效的服务器性能优化技术,包括内存数据库的应用、Spark RDD的使用、缓存策略的实施、SSD的引入、数据库优化、IO模型的选择、多核处理策略以及分布式部署方案。 ... [详细]
  • 本文是网络安全自学系列的一部分,旨在分享网络安全工具的使用技巧和实际操作案例。继之前讨论了XSS跨站脚本攻击的各个方面后,本文将重点介绍Powershell的基础知识及其在网络安全领域的应用。 ... [详细]
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社区 版权所有