首页 php教程 php手册 CakePHP 2.x CookBook 中文版 第五章 控制器 之 组件

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

Jun 13, 2016 am 10:54 AM
cakephp 中文版 共享 多个 控制器 组件

组件

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

 

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

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

企业微信如何共享屏幕 企业微信如何共享屏幕 Feb 28, 2024 pm 12:43 PM

越来越多的企业选择使用专属的企业微信,这不仅便于企业与客户、合作伙伴之间的沟通和交流,还极大地提高了工作效率。企业微信功能丰富,其中,共享屏幕功能备受欢迎。在会议过程中,通过共享屏幕,与会者可以更加直观地展示内容,从而更加高效地协作。那么究竟该如何在企业微信中高效的共享自己的屏幕呢,还不了解的用户们,这篇教程攻略就将为大家带来详细的内容介绍,希望能帮助到大家!企业微信怎么共享屏幕?1、在企业微信主界面的左侧蓝色区域内可以看到有一列功能,我们找到“会议”这个图标,点击进入之后,就会出现三种会议模式

如何在技嘉主板上设置键盘启动功能 (技嘉主板启用键盘开机方式) 如何在技嘉主板上设置键盘启动功能 (技嘉主板启用键盘开机方式) Dec 31, 2023 pm 05:15 PM

技嘉的主板怎么设置键盘开机首先,要支持键盘开机,一定是PS2键盘!!设置步骤如下:第一步:开机按Del或者F2进入bios,到bios的Advanced(高级)模式普通主板默认进入主板的EZ(简易)模式,需要按F7切换到高级模式,ROG系列主板默认进入bios的高级模式(我们用简体中文来示范)第二步:选择到——【高级】——【高级电源管理(APM)】第三步:找到选项【由PS2键盘唤醒】第四步:这个选项默认是Disabled(关闭)的,下拉之后可以看到三种不同的设置选择,分别是按【空格键】开机、按组

wallpaperengine如何共享给好友 wallpaperengine如何共享给好友 Mar 18, 2024 pm 10:00 PM

用户在使用wallpaperengine时可以将获得的壁纸共享给好友,有很多用户不知道wallpaperengine如何共享给好友,可以将自己喜欢的壁纸保存到本地之后再通过社交软件的方式分享给朋友。wallpaperengine如何共享给好友答:保存到本地之后分享给朋友。1、建议大家可以将自己喜欢的壁纸保存到本地之后再通过社交软件的方式分享给朋友。2、也可以通过文件夹的方式上传到电脑端,然后在电脑端用创意工坊的功能点击分享。3、在电脑端使用Wallpaperengine,打开创意工坊的选项栏找到

如何安装Win10旧版本组件DirectPlay 如何安装Win10旧版本组件DirectPlay Dec 28, 2023 pm 03:43 PM

不少用户在玩win10的的一些游戏的时候总是会遇到一些问题,比如说卡屏和花屏等等情况,这个时候我们是可以采用打开directplay这个功能来解决的,而且功能的操作方法也很简单。win10旧版组件directplay怎么安装1、在搜索框里面输入“控制面板”然后打开2、查看方式选择大图标3、找到“程序和功能”4、点击左侧的启用或关闭win功能5、选择旧版这里的勾选上就可以了

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CS玩家的首选:推荐的电脑配置 CS玩家的首选:推荐的电脑配置 Jan 02, 2024 pm 04:26 PM

1.处理器在选择电脑配置时,处理器是至关重要的组件之一。对于玩CS这样的游戏来说,处理器的性能直接影响游戏的流畅度和反应速度。推荐选择IntelCorei5或i7系列的处理器,因为它们具有强大的多核处理能力和高频率,可以轻松应对CS的高要求。2.显卡显卡是游戏性能的重要因素之一。对于射击游戏如CS而言,显卡的性能直接影响游戏画面的清晰度和流畅度。建议选择NVIDIAGeForceGTX系列或AMDRadeonRX系列的显卡,它们具备出色的图形处理能力和高帧率输出,能够提供更好的游戏体验3.内存电

Windows 11 文件夹共享指南:轻松分享你的文件和资料 Windows 11 文件夹共享指南:轻松分享你的文件和资料 Mar 13, 2024 am 11:49 AM

在日常生活和工作中,我们经常需要在不同设备之间共享文件和文件夹。Windows11系统提供了方便的内建文件夹共享功能,让我们可以轻松地在同一网络内安全地与他人分享所需内容,同时保护个人文件的隐私。这项功能使文件共享变得简单而高效,不必担心泄露私人信息。通过Windows11系统的文件夹共享功能,我们可以更加便捷地进行合作、交流和协作,提高工作效率和生活便利性。为了顺利配置共享文件夹,我们首先需要满足以下条件:所有(参与共享的)设备都连接到同一个网络。启用「网络发现」并配置好共享。知道目标设备中的

See all articles