ControllerCakePhp [ Cookbook2.x ]

컨트롤러는 MVC에서 'C'입니다. 라우팅이 적용된 후 컨틀롤러를 찾아 컨트롤러의 액션이 호출됩니다. 컨트롤러는 리퀘스트를 해석해서 적절한 모델(M)이 호출되는 것을 확인하고 알맞는 레스폰스 또는 뷰(V)를 출력합니다. 컨트롤러는 모델과  뷰의 소개자라고 볼 수 있습니다. 컨트롤러는 간단하고 심플하게 작성하고, 모델을 크게 하면 코드가 재사용하기 쉽고 비교적 테스트가 간단하게 가능합니다.

어플리케이션의 컨트롤러는 AppController 클래스를 상속하고 그것은 Controller를 상속하고 있습니다. AppController 클래스는 /app/Controller/AppController.php 에 정의하고, 어플리케이션의 컨트롤러들에서 전체적으로 공유해서 사용할만한 메소드를 포함하도록 합니다.

AppController

AppController 클래스는 모든 어플리케이션의 컨트롤러의 부모 클래스가 됩니다. AppController는 /app/Controller/AppController.php 에 다음과 같이 정의 합니다.
class AppController extends Controller{
}
보통의 객체지향의 상속 룰이 적용되어있다면 CakePHP는 컨트롤러에 있는 특정의 변수가 지정된 경우 동작을 확장합니다. 컨트롤러에서 사용되는 컴포넌트와 헬퍼의 리스트는 특별하게 취급되어 이러한 변수는 AppController의 값과 자식 컨트롤러의 값이 병합됩니다. 보통의 자식 클래스의 변수는 AppController의 변수를 덮어쓰게 됩니다.
//CakePHP는 AppController와 어플리케이션의 컨트롤러의 다음 변수를 병합합니다.
$components
$helpers
$uses
AppController에서 $helpers 변수를 정의 하게 되면 기본적으로 Html 헬러와 Form 헬퍼가 추가 됩니다. 그리고 자식 컨트롤러의 콜백에서는 AppController의 콜백을 호출하는 것은 아래와 같이 하는 것을 추천합니다.
public function beforeFilter() {
    parent::beforeFilter();
}

리퀘스트 파라메터

CakePHP 어플리케이션에서는 요청이 들어오면 Router 클래스와 Dispatcher클래스가 적절한 컨트롤러를 찾아 생성하기 위해 routes-configuration을 사용합니다. 리퀘스트 데이터는 리퀘스트 오브젝트 안에 캡슐화 되어 있습니다. CakePHP는 모든 중요한 리퀘스트정보를 $this->request 프로퍼티에 등록하고 있습니다. (CakeRequest 참조)

컨트롤러의 액션

리퀘스트 요청, 요청에 따른 처리, 결과 변환, 전송합니다. CakePHP의 규약을 따름으로 인해 이 일련의 처리 프로세스를 자동화하여 실제로 코드를 작성하지 않고도 처리가 가능하도록 합니다. CakePHP는 규약에 따라 액션명과 뷰를 작성합니다. OnlineBakery의 샘플을 예로 설명하면 RecipesController는 view(), share(), search() 액션이 포함되어 있습니다. 이 컨트롤러는 /app/Controller/RecipesController.php에 있고 다음과 같습니다.
# /app/Controller/RecipesController.php

class RecipesController extends AppController {
    public function view($id) {
        //action logic goes here..
    }

    public function share($customerId, $recipeId) {
        //action logic goes here..
    }

    public function search($query) {
        //action logic goes here..
    }
}
이 액션들의 뷰는 app/View/Recipes/view.ctp, app/View/Recipes/share.ctp, app/View/Recipes/search.ctp 입니다. 규약에 따라 뷰의 화일명은 액션명명을 소문자로하여 언더스코아로 연결합니다. 보통 컨트롤러의 액션에서는 View클래스에서 뷰를 작성할때 사용할 컨텍스트를 만들기 위해 set()을 사용합니다. CakePHP의 규약이 있으니 수동으로 뷰를 작성하거나 생성할 필요가 없습니다. 컨트롤러의 액션이 처리 완료되면 CakePHP는 뷰를 작성하고 전송합니다. 만일 기본 동작을 스킵하고 싶다면 다음과 같이 하면 뷰를 작성하는 기본 동작을 하지 않게 할 수 있습니다.
  • 컨트롤러의 액션에서 문자열 혹은 문자열로 변환 가능한 오브젝트를 반환하도록 하면 반환된 문자열이 결과로 전송됩니다.
  • 레스폰스로써 CakeResponse를 반환하는 것이 가능합니다.
컨트롤러의 메쏘드가 requestAction()에서 호출될때 문자열이 아닌 데이터를 반환하고자 하는 경우가 있을 것입니다. 혹시 일반적인 Web 리퀘스트와 requestAction 에서 호출되는 컨트롤러의 메소드가 았다면 값을 반환하기 전에 리퀘스트 타입을 체크하도록 합니다.
class RecipesController extends AppController {
    public function popular() {
        $popular = $this->Recipe->popular();
        if (!empty($this->request->params['requested'])) {
            return $popular;
        }
        $this->set('popular', $popular);
    }
}
위는 컨트롤러의 액션이 requestAction() 과 일반적인 리퀘스트에서 메소드락 어떤식으로 사용되는지에 대한 예입니다. requestAction이 아닌 일반 리퀘스트에 배열 데이터를 반환 값으로 반환하면 에러의 원이이 되니 주의합니다. (requestAction()의 보다 상세한 정보는 Controller::requestAction()을 참조) 어플리케이션의 컨트롤러의 효홀적으로 사용하기 위해 CakePHP의 컨트롤러가 제공하고 있는 몇가지 중요한 속성과 메소드를 설명하겠습니다.

리퀘스트 라이프 사이클 콜백

class

Controller

CakePHP 컨트롤러는 리퀘스트 라이프 사이클 사이에 로직을 추가 할 수 있도록 콜백 함수가 준비되어 있습니다.

Controller::beforeFilter()

이 함수는 컨트롤러명의 액선이 실행되기 전에 호출되어 실행됩니다. 액티브섹션닁 체크나 사용자 권한 체크시에 용이 합니다. beforeFilter()메소트와 액션이 존재하지않는 경우나 scaffold액션의 경우에도 호출 됩니다.

Controller::beforeRender()

컨트롤러의 액션뒤에 뷰가 작성되기 전에 호출됩니다. 이 콜백은 그다지 사용되지 않을 수도 있지만 액션 마지막에 render()를 수동으로 호출할 경우 사용 할 경우가 있을 수도 있습니다.

Controller::afterFilter()

컨트롤러의 액션 뒤에 뷰가 작성 완료된 뒤에 호출됩니다. 이 메소드는 컨트롤러의 맨 마지막에 실행되는 메소드입니다. 컨트롤러의 콜백과 더불어 컴포넌트도 같은 콜백을 제공합니다.

뷰와의 관계

컨트롤러와 뷰는 서로 영향을 주고있습니다. 처음에 컨트롤러는 set()을 사용하여 뷰에 데이터의 전달이 가능합니다. 어떤 뷰 클래스를 사용할지, 어떤 뷰를 작성해야 하는지를 결정하는 것도 가능합니다.

Controller::set(string $var, mixed $value)

set()메소드는 컨트롤러로 부터 뷰에 데이터를 전달하는 주된 방법입니다. 1번 set()을 사용하면 그 변수로 뷰 내부에서 접근 가능하게됩니다.
// 먼저 컨트롤러로 부터 데이터를 전달합니다.

$this->set('color', 'pink');
// 전달한 데이터는 뷰에서 이용 가능하게 됩니다.

set() 메소드는 처음 파라메터에 배열도 지정 가능합니다. 이 방법은 데이터의 구조체를 간단히 뷰에 전달하는 방법으로 사용됩니다.
$data = array(
    'color' => 'pink',
    'type' => 'sugar',
    'base_price' => 23.95
);

// 뷰에서 $color, $type, $base_price 의 변수로 사용할 수 있습니다.

$this->set($data);
$pageTitle 변수는 더이상 존재하지 않습니다. 타이틀을 설정하기 위해서는 set()을 사용해 주세요.
$this->set('title_for_layout', 'This is the page title');

Controller::render(string $view, string $layout)

render() 메소드는 각 액션의 마지막에 자동적으로 호출됩니다. 이메소드는 set()을 사용해서 전달한 데이터를 사용해서 모든 뷰 로직을 실행하고 뷰를 $layout 내에 배치하고 엔드유저에게 표시합니다. 렌러링에 사용되는 디폴트 뷰 파일은 규약에 따라 결정됩니다. RecipesController의 search() 액션이 리퀘스트 되면 /app/View/Recipes/search.ctp의 뷰 파일이 표시됩니다.
class RecipesController extends AppController {
// ...
    public function search() {
        // /View/Recipes/search.ctp 의 뷰가 표시됩니다.
        $this->render();
    }
// ...
}
CakePHP는 ($this->autoRender 가 false로 설정되지 않는한) 액션 마지막에 자동적으로 렌더링 메소드를 호출합니다만, 컨트롤러에서 $view에 뷰 이름을 지정하여 다른 뷰 파일이 표시되도록 하는 것도 가능합니다. $view가 '/'로 시작할 경우 /app/View 의 상태 패스에서 뷰 또는 엘리먼트를 찾으려고 합니다. 이렇게 엘리먼트를 직접 표시하는 것이 가능하여 Ajax 호출시에는 유용합니다.
// /View/Elements/ajaxreturn.ctp 의 뷰가 표시됩니다.
$this->render('/Elements/ajaxreturn');
$layout 파라메터는 뷰가 표시될 레이아웃을 지정할 수 있습니다.

지정한 뷰를 표시

컨트롤러에서는 규약에 따른 뷰 이외의 다른 뷰를 표시하기를 원할경우 render()를 직접 호출할 수있습니다. 1번이라도 render()를 호출하면 CakePHP는 재차 뷰를 표시하지 않습니다.
class PostsController extends AppController{
    public function my_action(){
        $this.render('custom_file');
    }
}
이것은 app/Posts/View/my_action.ctp 대신에 app/Posts/View/custom_file.ctp 를 표시합니다. 그리고 다음과 같은 형식으로 플러그인 내의 뷰를 표시하는 것도 가능합니다.
$this->render('PluginName.PluginController/custom_file');
예)
class PostsController extends AppController {
    public function my_action() {
        $this->render('Users.UserDetails/custom_file');
    }
}
이것은 app/Plugin/Users/View/UserDetails/custom_file.ctp 을 표시합니다.

흐름 제어

Controller::redirect(mixed $url, integer $status, boolean $exit)

자주 사용되는 처리 흐름을 제어하는 메소드는 redirect()입니다. 첫번채 변수는 CakePHP의 상대 url을 지정합니다. 유저의 주문이 정사일 경우 영수증 화면으로 리다이렉트를 한다면.
public function place_order(){
    if($success){
        return $this->redirect(array('controller' => 'order', 'action' => 'thanks'));
    }
    return $this->redirect(array('controller' => 'order', 'action' => 'confirm'));
}
$url에는 상대 URL 또는 절대 URL의 지정이 가능합니다.
$this->redirect('/orders/thanks'));
$this->redirect('http://www.example.com');
액션 데이터의 전달도 가능합니다.
$this->redirect(array('action' => 'edit', $id));
redirect() 의 2번째 파라메터는 리다이렉트시의 HTTP 상태 코드를 정의 할 수 있습니다. 보통 리다이렉트시 301(moved parmanently) 또는 303(see other)를 사용하는 것이 좋습니다. 이 메소드 3번째의 파라메터에 true를 지정하면 exit()를 호출합니다. 리퍼러 페이지에 리다이렉트 해야 할 경우 아래와 같이 지정합니다.
$this->redirect($this->referer());
이 메소드는 파라메터명과 값을 함께 전달할 수 있습니다. 예를 들면 http://www.example.com/orders/confirm/product:pizza/quantity:5 와 같은 URL에 리다이렉트 할 경우는 아래와 같이 사용합니다.
$this->redirect(array('controller' => 'orders', 'action' => 'confirm', 'product' => 'pizza', 'quantity' => 5));
리퀘스트 해쉬를 사용할 경우는 다음과 같이합니다.
$this->redirect(array('controller' => 'orders', 'action' => 'confirm', '?' => array('product' => 'pizza', 'quantity' => 5), '#' => 'top'));
생성된 URL은 다음과 같습니다. http://www.example.com/orders/confirm?product=pizza&quantity=5#top

Controller::flash(string $message, string $url, integer $pause, string $layout)

redirect() 와 같이 flash() 메소드도 처리가 끝난 뒤에 유저에게 새로운 페이지로 유도하는데 사용됩니다. flash() 메소드는 다른 URL로 이동시키기 전에 메세지를 표시하는 점이 다르다고 할 수 있습니다. 첫번째 파라메터는 표시할 메세지를 지정하고, 두번째 파라메터는 CakePHP의 상대 URL을 지정합니다. CakePHP는 페이지를 리다이렉트 하기전에 $pause 의 초간 $message 를 표시합니다. 표시할 메세지의 특정 템플릿이 있다면 $layout 파라메터에 그 레이아웃 명을 지정합니다. 페이지내의 flash 메세지에 대해서는 SessionComponent"::setFlash() 메소드를 참조해주세요.

콜백

리퀘스트 라이프 사이클 콜백에 추가하여 CakePHP는 scaffolding에 관련한 콜백도 서포트합니다.

Controller::beforScafoold($method)

$method는 예를 들면 index, edit등의 호출되어진 메소드명입니다.

Controller::afterScaffoldSave($method)

$method는 edit나 update로 호출되어진 메소드명입니다.

Controller::afterScaffoldSaveError($method)

$method는 edit나 update로 호출되어진 메소드명입니다.

Controller::scaffoldError($method)

$method는 예를 들면 index, edit등의 호출되어진 메소드명입니다.

그외 편리한 메소드

Controller::constructClasses()

이 메소드는 컨트롤러에 필요한 모델을 로드합니다. 모델을 로드하는 프로세스는 보통 CakePHP에서 실행 되지만 이 메소드는 다른 시점에서 컨트롤러에 액세스할때에 편리합니다. 커멘드라인 스립트 또는 다른 외부 프로그램을 CakePHP를 사용할 필요가 있을 경우 constructClasses()가 편리합니다.

Controller::referer(mixed $default = null, boolean $local = false)

현재 리퀘스트에 대한 리퍼러URL을 반환합니다. $default 파라메터는 HTTP_REFERER가 리퀘스트 헤더에 없을 경우 디폴트 URL로 지정합니다. 다음과 같이 사용합니다.
class UserController extends AppController{
    public function delete($id){
        //delete code goes here, and then ...
        if($this->referer() != '/'){
            return $this->redirect($this->referer());
        }
        return $this->redirect(array('action' => 'index'));
    }
}
아래와 같이 가능합니다.
class UserController extends AppController{
    public function delete($id){
        return $this->redirect($this->referer(array('action' => 'index'));
    }
}
$default 가 설정되지 않았을 경우 도메인의 루트 '/'를 티폴트로 반환합니다. $local 파라메터에 true를 설정하면 로컬 서버에 대한 리퍼러URL을 제한합니다.

Controller::disableCache()

유저가 사용하고 있는 브라우저에 대하여 현재 페이지가 캐쉬되지 않도록 페이지 헤더에 캐쉬 클리어 설정을 합니다. 이것을 호출했을 경우 헤더에 아래와 같이 설정되어 결과 페이지가 전송됩니다.
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: [current datetime] GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache

Controller::postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

POST된 모델 데이터(HtmlHelper와 호환성이 있는 입력 데이터)를 모델의 find 조건으로 설정 가능한 형태로 변환하는 메소드입니다. 이 함수는 검색 로직을 구축하는 단축키입니다. 예를 들어 관리 권한이있는 사용자가 어떤 제품을 출시 할 필요가 있는지를 알기 위해 주문을 검토하는 것이 좋습니다. 여기에서 Order 모델을 기반으로 양식을 만들기 위해 CakePHP의 FormHelper와 HtmlHelper를 사용할 수 있습니다. 이렇게 하면 컨트롤러의 액션은 입력 폼에서 post된 데이터를 find 조건을 만들기 위해 사용할 수 있습니다.
public function index() {
    $conditions = $this->postConditions($this->request->data);
    $orders = $this->Order->find('all', compact('conditions'));
    $this->set('orders', $orders);
}
$this->request->data['Order']['destination'] 가 "Old Towne Bakery" 이라면, postConditions는 그 조건을 Model->find()메소드에서 사용가능한 배열로 변환 합니다. 이 경우는 array('Order.destination' => 'Old Towne Bakery') 과 같은 형식이 됩니다. 만일 다른 SQL연산자를 사용하고 싶다면 그 연산자를 2번째 파라메터로 지정해 주세요.
/*
$this->request->data는 아래와 같은 형식입니다.
array(
    'Order' => array(
        'num_items' => '4',
        'referrer' => 'Ye Olde'
    )
)
*/

// 'Ye Olde'를 포함하고, 적어도 4개의 상품을 가지고 있는 주문
$conditions = $this->postConditions(
    $this->request->data,
    array(
        'num_items' => '>=',
        'referrer' => 'LIKE'
    )
);
$orders = $this->Order->find('all', compact('conditions'));
3번째 파라메터는 조건의 결합시 어떤 조합을 사용할지를 지정 할 수 있습니다. ‘AND’, ‘OR’, ‘XOR’와 같은 문자열 입니다. 마지막 파라메터는 true로, $op 파라메터가 배열이라면 , $op에 포함되지 않은 항목은 이 함수에서 반환되는 조건에 포함되지 않습니다.

Controller::paginate()

이 메소드는 모델로 부터 취득한 결과를 페이징 처리 하기 위해 사용됩니다. 페이지 사이즈나 모델의 find 조건등을 지정할 수 있습니다. paginate의 보다 상세한 사용법은 pagination 섹션을 참조해 주세요.

Controller::requestAction(string $url, array $options)

이 함수는 다른 곳에서 컨트롤러의 액션을 호출할때 액선으로 부터의 데이터를 반환합니다. $url에는 CakePHP의 상대 URL을 전달합니다.(controllername/actionname/params). 호출할 컨트롤러의 액션에 추가 데이터를 전달할 경우 %option배열을 지정해 주세요.

작성된 뷰를 취득하기 위해서는 requestAction($url, array('return')); 와 같이 option에 'return'을 전달하여 requestAction()을 사용하는 것이 가능합니다.

requestAction()을 캐쉬하지 않고 이용하면 성능이 저하 될 수 있습니다. 컨트롤러나 모텔에서는 드물게 사용됩니다.

requestAction()은 (캐쉬된)엘리먼트와의 조합으로 자주 사용됩니다. 렌더링전에 엘리먼트로 부타 데이터를 취득하기 위함입니다. 레이아웃 중에 "최근 코멘트"의 엘리먼트를 배치하기 위한 예제를 사용해 봅니다. 먼저 데이터를 반환하는 컨트롤러의 함수를 작성합니다.
// Controller/CommentsController.php
class CommentsController extends AppController {
    public function latest() {
        if (empty($this->request->params['requested'])) {
            throw new ForbiddenException();
        }
        return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
    }
}
requestAction()에서 실행하고자 하는 메소드는 실제로 requestAction()에서 리퀘스트가 발행되었는지를 체크할 필요가 있습니다. 그렇지 않으면 그 메소드는 URL로 부터 직접적으로 접근가능하게 되어버립니다. 이것은 추천되지 않습니다. 위의 함수를 호출하는 간단한 엘리먼트를 작성하면:
// View/Elements/latest_comments.ctp

$comments = $this->requestAction('/comments/latest');
foreach ($comments as $comment) {
    echo $comment['Comment']['title'];
}
어딘가 출력하고 싶은 곳에 방금 전의 엘리먼트를 배치 할 수 있습니다.
echo $this.element('latest_comments');
이 방법은 엘리먼트가 작성성될때마다 매번 데이터터를 가져오기 위해 컨트롤러에 요청을 만들어 데이터가 처리 되어 결과가 되돌아옵니다. 따라서 불필요한 처리를 방지하기 위해 엘리먼트의 캐쉬를 사용하는 것이 좋습니다.
 echo $this->element('latest_comments', array(), array('cache' => true));
requestAction()의 호출은 캐쉬된 엘리먼트의 뷰파일이 존재하고 유효할 경우 요청은 발행되지 않습니다. 또한, requestAction()은 CakePHP형식의 URL배열을 인수로 취할 수 있습니다.
echo $this->requestAction(
    array('controller' => 'articles', 'action' => 'featured'),
    array('return')
);
이것은 requestAction()의 호출이 성능 향상이 가능한 Router::url()의 이용을 피하는 것이 가능합니다. 배열 기반의 URL은 다음 한가지를 제외하고 Htmlhelper:link()를 사용하는 것과 같습니다. 다른 점은 명명된 파라메터터나 GET으로 전달되는 파라메터를 사용할 경우 그것을 2번째 인수에 지정하여 적절한 키로 랩핑하지 않으면 안되는 것입니다. 이것은 requestAction() 가 명명된 파라메터의 배열(requestAction의 2번째의 인수)를 Controller:params 배열에 병합하여 명명된 파라메터에 대해 명시적으로 'named'과 같은 키를 지정하지 않기 때문입니다. $option 배열에 지정한 추가한 값은 요청된 액션의 Contoller::params 배열의 안에서 사용할 수 있습니다.
echo $this->requestAction('/articles/featured/limit:3');
echo $this->requestAction('/articles/view/5');
위의 경우 requestAction()의 배열은 다음과 같습니다.
echo $this->requestAction(
    array('controller' => 'articles', 'action' => 'featured'),
    array('named' => array('limit' => 3))
);

echo $this->requestAction(
    array('controller' => 'articles', 'action' => 'view'),
    array('pass' => array(5))
);
requestAction()로 배열의 URL을 사용할 경우 요청한 액션에서 필요로 하는 모든 파라메터를 지정해야 합니다. 이것은 $this->request->data와 같은 파라메터도 포함됩니다. 필요한 모든 매개 변수를 전달할뿐만 아니라 명명된 파라메터와 GET 파라메터도 위와 같이 2번째의 인수로 지정해야합니다.

Controller::loadModel(string $modelClass, mixed $id)

loadModel() 함수는 컨트롤러 디포드 모델 또는 과련된 모델 이외의 모델을 사용할 필요가 있을 경우 편리합니다.
$this->loadModel('Article');
$recentArticles = $this->Article->find('all', array('limit' => 5, 'order' => 'Article.created DESC'));
$this->loadModel('User', 2);
$user = $this->User->read();

컨트롤러 변수

컨트롤러의 변수와 설명은 CakePHP API를 확인해주세요. http://api.cakephp.org/2.6/class-Controller.html

property Controller::$name

$name 변수는 컨트롤러명이 설정되어집니다. 보통 이것은 컨트롤러가 사용하는 메인 코델의 복수형입니다. 이 프로퍼티는 필수는 아닙니다.
// $name 변수의 사용 예
class RecipesController extends AppController {
   public $name = 'Recipes';
}

$components와 $helpers와 $uses

다음 설명할 컨트롤러의 변수는 현재 컨트롤러 안에서 어떤 헬퍼, 컴포넌트, 코델을 사용할지를 CakePHP에 전달하는 역활을 합니다. 이 변수는 자주 사용됩니다. 이것들을 사용하여 $components나 $uses에 할당된 MVC 클래스는 컨트롤러의 안에서 클래스 변수로서 (예 $this->ModelName), 또는 $helpers에 할당된 클래스는 뷰의 안에서 오브젝트의 참조로(예를 들 Ethis->{$helpername}) 사용할 수 있습니다.

각각의 컨트롤러는 기본적으로 이러한 클래스를 몇개 가지고 있어 사용 할 수 있는 상태입니다. 따라서 컨트롤러는 모두 설정 할 필요는 없습니다.

property Controller::$uses

컨트롤러는 기본적으로 중효한 모텔에 접근 가능하도록 되어있습니다. RecipesController는 $this->Recipe에 접근 가능한 모델 클래스를 가지고 있으며 ProductsController 역시 $this->Product로 Product모델을 가지고 있습니다. 그리고 컨트롤러가 $uses 변수에 추가 모델ㅇ르 지정하여 그것들이 사용 가능하게 될때에 $uses에 현재의 컨트롤러의 모델 명도 포함하지 않으면 안됩니다. 이것에 대해서는 아래 예제에서 설명합니다. 컨트롤러에서 모델을 사용하고 싶지 않을 경우는 public $uses = array() 를 설정해 주세요. 이것으로 컨트롤러에 대응하는 모델 파일이 필요 없게 됩니다.

property Controller::$helpers

SessionComponent와 같이 HtmlHelper, FormHelper, SessionHelper는 기본적으로 사용할 수 있습니다. 따라서 AppController에서 $helpers를 독자적으로 정의할 경우 HtmlHelper dhk FormHelper를 콘트롤러에서 사용할 수 있도록 하지 않으면 안됩니다. 그것들을 $helpers에 포함되도록 해주세요. 추가로 이용할 MVC 클래스들을 어떻게 CakePHP의 컨트롤러에 전달하는지 살펴봅니다.:
class RecipesController extends AppController{
    public $uses = array('Recipe', 'User');
    public $helpers = array('Js');
    public $components = array('RequestHandler');
}
이 변수들은 상속한 값과 병합됩니다. 따라서 예를 들어 FormHelper나 AppController에 선언되어 있는 클래스를 다시 선언 할 필요가 없습니다.

property Controller::$components

components 배열은 컨트롤러에서 사용하는 컴포넌트를 설정합니다. $helpers나 $uses와 같이 컨트롤러의 컴포넌트는 AppController의 컴포넌트와 병합됩니다. $helpers와 같이 $componetns에 설정을 전달하는 것도 가능합니다. 보다 상세한 내용은 컴포넌트의 설정을 참조해 주세요.

그 외의 변수

컨트롤러의 변수의 세부내용은 API페이지를 보면 여기의 설명 이외의 다른 컨트롤러변수에 대한 섹션이 있습니다.

property Controller::$cacheAction

cacheAction변수는 전체 페이지 캐쉬의 유지시간이나 다른 정보를 정의하기 위해서 사용됩니다. 전체 페이지 캐쉬에 대한 세부내용은 CacheHelper의 문서를 확인해주세요.

property Controller::$paginate

paginate변수는 비추천의 호환성이 있는 프로퍼티입니다. 이 변수를 사용하여 PaginatorComponent의 로딩과 설정을 합니다. 다음과 같이 컴포넌트의 설정을 수정하는 것을 추천합니다.
class ArticlesController extends AppController{
    public $components = array(
        'Paginator' => array(
            'Article' => array(
                'conditions' => array('published' => 1)
            )
        )
    );
}