search
HomeBackend DevelopmentPHP TutorialCakePHP 2.x CookBook 中文版 第五章 控制器 之 组件_PHP教程
CakePHP 2.x CookBook 中文版 第五章 控制器 之 组件_PHP教程Jul 14, 2016 am 10:08 AM
cakephpChinese VersionsharedMultiplecontrollerofchaptercomponents

组件

组件是在多个控制器中共享的逻辑包。如果人发现自己想要在控制器间复制粘贴某些东西时,你就应该考虑将一些功能包装在一个组件中了。
 
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组件 组件是在多个控制器中共享的逻辑包。如果人发现自己想要在控制器间复制粘贴某些东西时,你就应该考虑将一些功能包装在一个组件...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
如何使用CakePHP中的数据库查询构造器?如何使用CakePHP中的数据库查询构造器?Jun 04, 2023 am 09:02 AM

CakePHP是一个开源的PHPMVC框架,它广泛用于Web应用程序的开发。CakePHP具有许多功能和工具,其中包括一个强大的数据库查询构造器,用于交互性能数据库。该查询构造器允许您使用面向对象的语法执行SQL查询,而不必编写繁琐的SQL语句。本文将介绍如何使用CakePHP中的数据库查询构造器。建立数据库连接在使用数据库查询构造器之前,您首先需要在Ca

如何在CakePHP中创建自定义分页?如何在CakePHP中创建自定义分页?Jun 04, 2023 am 08:32 AM

CakePHP是一个强大的PHP框架,为开发人员提供了很多有用的工具和功能。其中之一是分页,它可以帮助我们将大量数据分成几页,从而简化浏览和操作。默认情况下,CakePHP提供了一些基本的分页方法,但有时你可能需要创建一些自定义的分页方法。这篇文章将向您展示如何在CakePHP中创建自定义分页。步骤1:创建自定义分页类首先,我们需要创建一个自定义分页类。这个

如何使用PHP和CakePHP框架进行应用程序开发如何使用PHP和CakePHP框架进行应用程序开发May 11, 2023 pm 03:39 PM

在当今数字化时代,应用程序对于企业和个人来说,已经成为了不可或缺的一部分。应用程序能够让人们更加便捷地进行各种操作,而PHP和CakePHP框架则是日益流行的应用程序开发工具。在本文中,我们将讨论如何使用PHP和CakePHP框架进行应用程序开发。一、PHP是什么?PHP(外文全称为“HypertextPreprocessor”)是一种开源的服务器端脚本语

如何在CakePHP中使用FPDF?如何在CakePHP中使用FPDF?Jun 03, 2023 pm 06:32 PM

CakePHP是一种流行的PHP框架,用于开发Web应用程序。与许多其他PHP框架一样,CakePHP也提供了许多有用的功能和插件来帮助业务流程,其中包括生成PDF文件。这项任务可以使用FPDF插件轻松完成。本文将介绍如何在CakePHP中使用FPDF。FPDF是一种开源的PHP类库,用于生成PDF文件。它具有许多有用的功能,例如嵌入字体、添加图像、绘制基本

如何在CakePHP中使用Guzzle?如何在CakePHP中使用Guzzle?Jun 03, 2023 pm 01:51 PM

CakePHP是一款优秀的PHP开发框架,它通过提供一系列强大的功能和工具,简化了Web应用程序的开发过程。而Guzzle是一个PHPHTTP客户端和请求库,它能够帮助开发者轻松地发送HTTP请求和访问Web服务。在本文中,我们将介绍如何在CakePHP中使用Guzzle,以便更加高效地开发Web应用程序。一、安装Guzzle首先,我们需要在CakePHP

如何在CakePHP中使用多个数据库连接?如何在CakePHP中使用多个数据库连接?Jun 04, 2023 am 08:21 AM

CakePHP是一款流行的PHP开发框架,它提供了快速开发Web应用程序所需的基本功能和结构。在现代应用中,使用多个数据库连接已经成为了一个普遍的需求,例如,建立主从数据库连接或将数据分片到不同的数据库中。本文将介绍如何在CakePHP中使用多个数据库连接。CakePHP中的默认数据库连接在开始之前,让我们先了解一下CakePHP中默认的数据库连接。Cake

如何在CakePHP中进行数据查询和更新?如何在CakePHP中进行数据查询和更新?Jun 03, 2023 pm 02:11 PM

CakePHP是一个流行的PHP框架,它提供了方便的ORM(对象关系映射)功能,使得查询和更新数据库变得非常容易。本文将介绍如何在CakePHP中进行数据查询和更新。我们将从简单的查询和更新开始,逐步深入,了解如何使用条件和关联的模型来更复杂地查询和更新数据。基本查询首先,让我们看看如何进行最简单的查询。假设我们有一个名为“Users”的数据表,并且我们想要

如何使用CakePHP中的Cookie组件?如何使用CakePHP中的Cookie组件?Jun 03, 2023 pm 06:31 PM

CakePHP是一款流行的PHP框架,它为Web开发提供了许多便利的功能。其中一个非常有用的功能是Cookie组件。在本文中,我们将介绍如何在CakePHP中使用Cookie组件来存储和检索数据。一、什么是Cookie?Cookie是一个小的数据片段,存储在网站上的用户计算机上。它可以用来存储用户喜好、登陆信息和其他相关的数据。Cookie可以被服务器和客户

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),