0

0

CakePHP 2.x CookBook 中文版 第五章 控制器 之 组件_PHP教程

php中文网

php中文网

发布时间:2016-07-14 10:08:26

|

1081人浏览过

|

来源于php中文网

原创

组件

组件是在多个控制器中共享的逻辑包。如果人发现自己想要在控制器间复制粘贴某些东西时,你就应该考虑将一些功能包装在一个组件中了。
 
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');
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');
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 内设置的值匹配的值。
 
回调www.2cto.com
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’ 元素是可选的。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477792.htmlTechArticle组件 组件是在多个控制器中共享的逻辑包。如果人发现自己想要在控制器间复制粘贴某些东西时,你就应该考虑将一些功能包装在一个组件...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ios开发手册中文版
ios开发手册中文版

共25课时 | 20.7万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 1万人学习

极客学院HTML5开发入门视频教程
极客学院HTML5开发入门视频教程

共36课时 | 8.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号