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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

CakePHP 프로젝트 구성 CakePHP 프로젝트 구성 Sep 10, 2024 pm 05:25 PM

이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

WeChat Enterprise에서 화면을 공유하는 방법 WeChat Enterprise에서 화면을 공유하는 방법 Feb 28, 2024 pm 12:43 PM

점점 더 많은 기업이 독점 기업 WeChat을 선택하고 있습니다. 이는 기업과 고객, 파트너 간의 의사소통을 촉진할 뿐만 아니라 업무 효율성도 크게 향상시킵니다. Enterprise WeChat에는 풍부한 기능이 있으며 그 중 화면 공유 기능이 매우 인기가 있습니다. 회의 중에 화면을 공유함으로써 참가자들은 콘텐츠를 보다 직관적으로 표시하고 보다 효율적으로 협업할 수 있습니다. 그렇다면 WeChat Enterprise에서 화면을 효율적으로 공유하는 방법은 무엇입니까? 아직 모르는 사용자를 위해 이 튜토리얼 가이드가 도움이 되기를 바랍니다. WeChat Enterprise에서 화면을 공유하는 방법은 무엇입니까? 1. Enterprise WeChat 메인 인터페이스 왼쪽의 파란색 영역에 "컨퍼런스" 아이콘이 표시됩니다. 클릭하면 세 가지 컨퍼런스 모드가 나타납니다.

친구들과 wallpaperengine을 공유하는 방법 친구들과 wallpaperengine을 공유하는 방법 Mar 18, 2024 pm 10:00 PM

사용자는 WallpaperEngine을 사용할 때 얻은 배경화면을 친구들과 공유할 수 있습니다. 많은 사용자는 자신이 좋아하는 배경화면을 로컬에 저장한 다음 소셜 소프트웨어를 통해 친구들과 공유할 수 있습니다. wallpaperengine을 친구들과 공유하는 방법 답변: 로컬에 저장하고 친구들과 공유하세요. 1. 좋아하는 배경화면을 로컬에 저장한 다음 소셜 소프트웨어를 통해 친구들과 공유하는 것이 좋습니다. 2. 폴더를 통해 컴퓨터에 업로드한 후 컴퓨터의 창작 워크숍 기능을 사용하여 공유를 클릭할 수도 있습니다. 3. 컴퓨터에서 Wallpaperengine을 사용하고 크리에이티브 워크숍의 옵션 막대를 열고

GIGABYTE 마더보드에서 키보드 부팅 기능을 설정하는 방법(GIGABYTE 마더보드에서 키보드 부팅 모드 활성화) GIGABYTE 마더보드에서 키보드 부팅 기능을 설정하는 방법(GIGABYTE 마더보드에서 키보드 부팅 모드 활성화) Dec 31, 2023 pm 05:15 PM

Gigabyte 마더보드에서 키보드 시작을 설정하는 방법 먼저, 키보드 시작을 지원해야 한다면 PS2 키보드여야 합니다! ! 설정 단계는 다음과 같습니다. 1단계: 부팅 후 Del 또는 F2를 눌러 BIOS에 들어가고, BIOS의 고급(Advanced) 모드로 들어갑니다. 일반 마더보드는 기본적으로 마더보드의 EZ(Easy) 모드로 들어갑니다. F7을 눌러 고급 모드로 전환합니다. ROG 시리즈 마더보드는 기본적으로 BIOS로 들어갑니다. 고급 모드(간체 중국어를 사용하여 설명) 2단계: - [고급] - [고급 전원 관리(APM)]를 선택합니다. [PS2 키보드로 깨우기] 옵션 찾기 4단계: 이 옵션 기본값은 비활성화입니다. 아래로 당기면 세 가지 다른 설정 옵션이 표시됩니다. 즉, 컴퓨터를 켜려면 [스페이스바]를 누르고 그룹을 누르세요.

Windows 10 이전 버전 구성 요소 DirectPlay를 설치하는 방법 Windows 10 이전 버전 구성 요소 DirectPlay를 설치하는 방법 Dec 28, 2023 pm 03:43 PM

많은 사용자가 win10에서 일부 게임을 플레이할 때 화면이 멈추거나 화면이 흐려지는 등의 문제에 항상 직면합니다. 이때 다이렉트 플레이 기능을 켜면 문제를 해결할 수 있으며 기능 작동 방법도 매우 간단합니다. 이전 버전의 win10 컴포넌트 다이렉트플레이 설치 방법 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와 같은 게임을 플레이할 때 프로세서의 성능은 게임의 부드러움과 응답 속도에 직접적인 영향을 미칩니다. Intel Core i5 또는 i7 시리즈 프로세서는 강력한 멀티 코어 처리 기능과 높은 주파수를 갖추고 CS의 높은 요구 사항에 쉽게 대처할 수 있으므로 선택하는 것이 좋습니다. 2. 그래픽 카드 그래픽 카드는 게임 성능을 좌우하는 중요한 요소 중 하나입니다. CS 등 슈팅 게임에서는 그래픽 카드의 성능이 게임 화면의 선명도와 부드러움에 직접적인 영향을 미칩니다. NVIDIA GeForce GTX 시리즈 또는 AMD Radeon RX 시리즈 그래픽 카드를 선택하는 것이 좋습니다. 이 카드는 뛰어난 그래픽 처리 기능과 높은 프레임 속도 출력을 갖추고 있으며 더 나은 게임 경험을 제공할 수 있습니다.

Windows 11 폴더 공유 가이드: 파일과 데이터를 쉽게 공유 Windows 11 폴더 공유 가이드: 파일과 데이터를 쉽게 공유 Mar 13, 2024 am 11:49 AM

일상 생활과 직장에서 우리는 종종 서로 다른 장치 간에 파일과 폴더를 공유해야 합니다. Windows 11 시스템에는 편리한 폴더 공유 기능이 내장되어 있어 개인 파일의 개인 정보를 보호하면서 동일한 네트워크 내에서 다른 사람들과 필요한 콘텐츠를 쉽고 안전하게 공유할 수 있습니다. 이 기능을 사용하면 개인 정보 유출에 대한 걱정 없이 파일을 간단하고 효율적으로 공유할 수 있습니다. Windows 11 시스템의 폴더 공유 기능을 통해 우리는 보다 편리하게 협력하고, 소통하고 협업할 수 있어 업무 효율성과 생활 편의성이 향상됩니다. 공유 폴더를 성공적으로 구성하려면 먼저 다음 조건을 충족해야 합니다. 공유에 참여하는 모든 장치가 동일한 네트워크에 연결되어 있습니다. 네트워크 검색을 활성화하고 공유를 구성합니다. 대상 장치를 알아라

See all articles