컴포넌트

컴포넌트는 컨트롤러간에 공유되는 로직의 패키지입니다. 만약 컨트롤러간에 복사 및 붙여 넣기를 하고 싶은 부분이 있다면 몇 가지 기능을 컴포넌트로 랩핑 할 수 있을지도 모릅니다.

또한 CakePHP는 다음과 같은 목적으로 사용할 수있는 훌륭한 핵심 컴포넌트가 준비되어 있습니다. :

  • 보안
  • 세션
  • 액세스 제어
  • 이메일
  • 쿠키
  • 인증
  • 요청 처리
  • 페이지 전환

각 핵심 컴포넌트의 자세한 것은 각 장에서 설명합니다. 여기에서 독자적인 컴포넌트를 만드는 방법을 소개합니다. 컴포넌트를 작성함으로인해 컨트롤러의 코드가 깨끗한 상태로 유지되고 프로젝트에서 코드를 재사용하기 쉬워집니다.

컴포넌트의 설정

핵심 컴포넌트의 대부분은 설정을 필요로하고 있습니다. 컴포넌트가 설정을 필요로하고있는 예는 인증 과 Cookie 등입니다. 이러한 컴포넌트와 일반 컴포넌트의 설정은 대부분의 경우 $components 배열이나 컨트롤러의 beforeFilter() 메소드에서 이루어집니다. :

  class PostsController extends AppController {
     public $components = array(
         'Auth'=> array(
             'authorize'=> array( 'controller')
             'loginAction'=> array( 'controller'=> 'users', 'action'=> 'login')
         ),
         'Cookie'=> array( 'name'=> 'CookieMonster')
     );

이것은 $components 배열 요소를 설정하는 예입니다. 모든 핵심 컴포넌트는 이 방법으로 설정할 수 있습니다. 또한 컨트롤러의 beforeFilter() 메소드에서도 설정할 수 있습니다. 이것은 함수의 결과를 컴포넌트의 프로퍼티에 설정할 때 유용합니다. 위의 예는 다음과 같이 작성됩니다. :

  public function beforeFilter() {
     $this -> Auth -> authorize = array( 'controller');
     $this -> Auth -> loginAction = array( 'controller'=> 'users', 'action'=> 'login');

     $this -> Cookie -> name = 'CookieMonster';
 }

그러나 컴포넌트의 옵션을 컨트롤러의 beforeFilter()가 실행되기 전에 설정하는 것이 가능한 경우도 있습니다. 즉, 컴포넌트 중에는 $components 배열에 옵션을 설정할 수있는 것이 있습니다. :

  public $components = array(
     'DebugKit.Toolbar'=> array( 'panels'=> array( 'history', 'session'))
 );

각 컴포넌트가 어떤 설정 옵션을 제공하는지는 관련 문서를 참조하십시오.

공통 설정 중 하나에 className 옵션이 있습니다. 이 옵션을 사용하면 컴포넌트에 별명을 붙일 수 있습니다. 이 기능은 $this-> Auth 및 기타 컴포넌트의 참조를 자체적으로 구현하여 대체하고 싶을 때 유용합니다. :

  // app/Controller/PostsController.php
 class PostsController extends AppController {
     public $components = array(
         'Auth'=> array(
             'className'=> 'MyAuth'
         )
     );
 }

 // app/Controller/Component/MyAuthComponent.php
 App :: uses( 'AuthComponent', 'Controller/Component');
 class MyAuthComponent extends AuthComponent {
     // 코어 AuthComponent를 덮어쓸 코드를 추가
 }

위의 예에서는 컨트롤러에서 MyAuthComponent에 $this-> Auth라는 별명을 달고 있습니다.

별명을 붙인 컴포넌트는 컴포넌트가 사용하는 모든 곳의 인스턴스를 바꿉니다. 이것은 다른 컴포넌트의 내부를 포함합니다.

컴포넌트의 사용

일단 컴포넌트를 컨트롤에서 읽어 들였다면 사용하는 것은 매우 간단합니다. 사용중인 각 컴포넌트는 컨트롤러의 속성처럼 보입니다. 만일 SessionComponent 와 CookieComponent 를 컨트롤러로 읽어 들인 경우 다음과 같이 액세스 할 수 있습니다. :

  class PostsController extends AppController {
     public $components = array( 'Session', 'Cookie');

     public function delete() {
         if($this -> Post -> delete($this -> request -> data( 'Post.id')) {
             $this -> Session -> setFlash( 'Post deleted.');
             return $this -> redirect(array( 'action'=> 'index'));
         }
     }

모델과 컴포넌트 모두가 컨트롤러에 속성으로 추가되므로, 그들은 같은 ‘네임 스페이스’를 공유합니다. 컴포넌트와 모델에 같은 이름을 사용하지 않도록 주의하십시오.

컴포넌트의 동적 로딩

모든 컨트롤러 액션에서 모든 컴포넌트를 사용할 수 있도록 할 필요는 없을지도 모릅니다. 이러한 상황에서는 런타임에 컴포넌트 컬렉션을 사용하여 컴포넌트를 로드 할 수 있습니다. 컨트롤러 내부에서 다음과 같이 할 수 있습니다. :

  $this -> OneTimer = $this -> Components -> load( 'OneTimer');
 $this -> OneTimer -> getTime();

컴포넌트가 동적으로 로드 된 경우 초기화 메소드가 실행되지 않는 것을 기억하십시오. 이 메소드에서 읽어 들인 경우 로드 된 후 수동으로 실행해야합니다.

컴포넌트의 콜백

컴포넌트는 또한 몇 가지 요청 라이프 사이클에 요청 라이프 사이클을 늘릴 수 있는 콜백을 제공합니다. 컴포넌트가 제공하는 컴포넌트에 대한 자세한 내용은 컴포넌트 API 의 기본을 참조하십시오.

컴포넌트를 만들

응용 프로그램의 다양한 부분에서 복잡한 수학적 처리를 필요로하는 온라인 응용 프로그램을 가정합니다. 이제 컨트롤러의 곳곳에서 사용하기위한 공유 로직을 통합하기위한 컴포넌트를 만듭니다.

먼저, 새로운 컴포넌트 파일과 클래스를 만듭니다. /app/Controller/Component/MathComponent.php에 파일을 작성하십시오. 컴포넌트의 기본 구조는 다음과 같습니다. :

  App :: uses( 'Component', 'Controller');
 class MathComponent extends Component {
     public function doComplexOperation($amount1 $amount2) {
         return $amount1 + $amount2;
     }
 }

모든 컴포넌트는 Component 를 상속해야합니다. 상속되지 않은 경우, 예외가 발생합니다.

컨트롤러에서 컴포넌트를 로드

일단 컴포넌트가 완성되고 나면 컨트롤러의 $components 배열에있는 요소 이름(Component의 부분을 제거하는)을 대체하여 사용할 수있게합니다. 컨트롤러는 그 컴포넌트에 유래하는 새로운 속성을 자동으로 부여되는 것입니다. 그 속성을 통해 인스턴스에 액세스 할 수 있습니다. :

 /* 표준 $this-> Session뿐만 아니라 새로운 요소를 $this-> Math에서 사용할 수있게합니다.  * /
 public $components = array( 'Math', 'Session');

AppController에서 선언 된 컴포넌트는 다른 컨트롤러에서 선언 된 컴포넌트와 병합됩니다. 동일한 컴포넌트를 두 번 선언 할 필요는 없습니다.

컨트롤러에서 컴포넌트를 읽어 들일 때 컴포넌트의 생성자에 전달 파라메타를 선언 할 수 있습니다. 이 매개 변수는 컴포넌트에 의해 처리됩니다. :

  public $components = array(
     'Math'=> array(
         'precision'=> 2,
         'randomGenerator'=> 'srand'
     ),
     'Session', 'Auth'
 );

위의 예에서는 precision와 randomGenerator를 포함한 배열이 MathComponent :: __ construct()의 두 번째 인수로 전달됩니다. 컴포넌트의 공용 속성이나 인수로 전달되는 설정은 배열에 따라 값입니다.

컴포넌트에서 다른 컴포넌트를 사용

작성중인 컴포넌트에서 다른 컴포넌트를 사용하고 싶을 때이 가끔 있습니다. 그 경우 작성중인 컴포넌트에서 다른 컴포넌트를 로드 할 수 있으며, 그 방법은 컨트롤러에서 $components 변수를 사용하여 가져 오는 경우와 동일합니다. :

 // app/Controller/Component/CustomComponent.php
 App :: uses( 'Component', 'Controller');
 class CustomComponent extends Component {
     // 구현중인 컴포넌트를 사용하는 다른 컴포넌트
     public $components = array( 'Existing');

     public function initialize(Controller $controller) {
         $this -> Existing -> foo();
     }

     public function bar() {
         // ...
    }
 }

 // app/Controller/Component/ExistingComponent.php
 App :: uses( 'Component', 'Controller');
 class ExistingComponent extends Component {

     public function foo() {
         // ...
     }
 }

컨트롤러에서 가져온 컴포넌트와 달리 컴포넌트에서 컴포넌트를 가져온 경우 콜백이 불리지 않는 점에 유의하십시오.

컴포넌트 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 메서드는 컨트롤러 redirect 메소드가 불려 때 다른 액션보다 먼저 불려집니다. 이 메소드가 false를 반환 할 때 컨트롤러는 Request 리디렉션을 중단합니다. $url, $status와 $exit 변수는 컨트롤러의 메소드와 같은 의미입니다. 또한 리디렉션 URL 문자열을 반환하거나 ‘url’와 ‘status’와 ‘exit’를 키로 가지는 연관 배열을 반환 할 수 있습니다. ‘status’와 ‘exit’는 선택 사항입니다.

'PHP' 카테고리의 다른 글

CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - PageController  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
[CakePHP] CakeResponse  (0) 2015.05.07
Posted by dewnine
,