3.5.3 コントローラのメソッド

コントローラのメソッドの完全なリストとその説明は、CakePHPのAPIを参照してください。http://api.cakephp.org/1.2/class_controller.htmlにあります。

3.5.3.1 ビューとの連携

3.5.3.1.1 set

set(string $var, mixed $value)
  1. set(string $var, mixed $value)

set() メソッドは、コントローラからビューへデータを送るための主な方法です。set() を使うと、ビューでは、変数としてアクセスできます。

<?php
    
//まず、コントローラーから値を渡します:

$this->set('color', 'pink');

//ビューでは、以下のようにデータを利用できます:

You have selected <?php echo $color; ?> icing for the cake.

?>
  1. <?php
  2. //まず、コントローラーから値を渡します:
  3. $this->set('color', 'pink');
  4. //ビューでは、以下のようにデータを利用できます:
  5. You have selected <?php echo $color; ?> icing for the cake.
  6. ?>

set() の第1引数に、連想配列として渡すこともできます。場合によっては、ビューに情報のセットを割り当てるのに簡単な方法になります。配列のキーは、ビューに割り当てる前に変換されることに注意してください。 (‘underscored_key’ は、 ‘underscoredKey’になる等):

<?php
    
$data = array(
    'color' => 'pink',
    'type' => 'sugar',
    'base_price' => 23.95
);

//$color, $type, $basePrice を、 
//ビューで利用できるようにする:

$this->set($data);  

?>
  1. <?php
  2. $data = array(
  3. 'color' => 'pink',
  4. 'type' => 'sugar',
  5. 'base_price' => 23.95
  6. );
  7. //$color, $type, $basePrice を、
  8. //ビューで利用できるようにする:
  9. $this->set($data);
  10. ?>

3.5.3.1.2 render

render(string $action, string $layout, string $file)
  1. render(string $action, string $layout, string $file)

render() メソッドは、コントローラーのアクションの最後に自動的に呼ばれます。このメソッドは、(set()メソッドでセットしたデータを使用して)ビューのロジックをすべて実行し、レイアウトの中にビューを設置し、エンドユーザ-に返すサービスを行います。

render によって使用されるデフォルトのビューファイルは、規約で定められています。もし RecipesController コントローラの search() アクションがリクエストされたなら、/app/views/recipes/search.ctp にあるビューファイルが使用されます。

CakePHP がアクションのすべてのロジックの後に render() を ($this->autoRender が false でないとき) 自動的に呼びますが、 $action 引数を使ってコントローラのアクション名を指定することで別のビューファイルを使用することができます。 また、第3引数の $file で代わりのビューを指定することができます。 $file 引数を利用する時には、CakePHP のグローバル定数 (VIEWS など)のいくつかを使用することを忘れないでください。

$layout 引数は、ビューを表示するレイアウトを指定することができます。

3.5.3.2 フロー制御

3.5.3.2.1 redirect

redirect(string $url, integer $status, boolean $exit)

もっともよく使用するフロー制御のメソッドは、redirect() です。このメソッドは、第1引数に CakePHP 流の相対 URL を指定します。 ユーザーが首尾よく注文したとき、領収書の画面にリダイレクトさせたいかもしれません。

<?php
	
function placeOrder() {

    //ここは注文完了のロジック

    if($success) {
        $this->redirect('/orders/thanks');
    } else {
        $this->redirect('/orders/confirm');
    }
}

?>
  1. <?php
  2. function placeOrder() {
  3. //ここは注文完了のロジック
  4. if($success) {
  5. $this->redirect('/orders/thanks');
  6. } else {
  7. $this->redirect('/orders/confirm');
  8. }
  9. }
  10. ?>

redirect() の第2引数は、リダイレクトの際の HTTP ステータスコードを指定します。リダイレクトの状況によっては、 301 (永久的な移転)や 303 (see other) を指定したくなるかもしれません。

このメソッドは、第3引数に false をセットしなければ、リダイレクト後に exit() が実行されます。

3.5.3.2.2 flash

flash(string $message, string $url, integer $pause)
  1. flash(string $message, string $url, integer $pause)

flash() メソッドも、ページ遷移に使用します。 flash() メソッドでは、別の URL へ移る前にメッセージを表示するところが redirect() メソッドと異なります。

第1引数は、表示するメッセージです。そして、第2引数は、CakePHP 流の相対 URL です。CakePHP は、$pause (第3引数) 秒間、メッセージを表示ます。

ページ遷移後のメッセージ表示については、SessionComponent クラスの setFlash() メソッドを参照ください。

3.5.3.3 コールバック

CakePHP のコントローラは、コールバックを使うとアクション実行の前後にロジックを挿入できます。

beforeFilter()

この関数は、コントローラにある全てのアクションの前に実行されます。 セッションやユーザ権限のチェックに便利です。

beforeRender()

コントローラのアクションロジックを実行した後に呼ばれます。ただし、ビューを表示する前です。このコールバックはあまり使われません。 しかし、アクションの途中、手動で render() を読んだときなどに必要かもしれません。

afterFilter()

コントローラの全てのアクションの後に呼ばれます。

afterRender()

表示済みのアクションの後に呼ばれます。

CkakePHP は、scaffolding (足場組み) に関連するコールバックもサポートします。

_beforeScaffold($method)

$method は、呼ばれたメソッド名。例えば「index, edit」 など。

_afterScaffoldSave($method)

$method は、edit か update いずれかのメソッド名。

_afterScaffoldSaveError($method)

$method は、edit か update いずれかのメソッド名。

_scaffoldError($method)

$method は、呼ばれたメソッド名。例えば「index, edit」 など。

3.5.3.4 その他の便利なメソッド

3.5.3.4.1 constructClasses

このメソッドは、コントローラに必要なモデルを読み込みます。通常、この読み込み処理は、CakePHP によって行われます。しかし、このメソッドは、通常と異なる方法でコントローラにアクセスするとき、あると便利です。もし、コマンドラインスクリプトや、通常の利用以外に CakePHP が必要な時、 constractClasses() が役に立つかもしれません。

3.5.3.4.2 referer

現在のリクエストの参照元 URL を返します。

3.5.3.4.3 disableCache

現在のリクエストの結果をキャッシュしないように、ユーザのブラウザに通知するのに利用してください。これは、あとの章で説明するビューのキャッシュとは違います。

3.5.3.4.4 postConditions

postConditions(array $data, mixed $op, string $bool, boolean $exclusive)
  1. postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

このメソッドを使用すると、POST された一連のモデルのデータ(Htmlヘルパーと互換のある入力値)をモデル用の find 条件に変換できます。この関数は、検索ロジックを素早く構築するためのショートカットです。たとえば、管理権限のあるユーザが、どの項目が入力されたかを知るために順序を検索したい。CakePHP の Form ヘルパーや Html ヘルパーを使用して、Order モデルに基づいて素早くフォームを生成することができます。コントローラのアクションは、そのフォームから POST されたデータを使用して find 条件を組み立てることができます。:

function index() {
    $o = $this->Orders->findAll($this->postConditions($this->data));
    $this->set('orders', $o);
}
  1. function index() {
  2. $o = $this->Orders->findAll($this->postConditions($this->data));
  3. $this->set('orders', $o);
  4. }

仮に $this->data[‘Order’][‘destination’] の値が “Old Towne Bakery” と等しい場合、postConditions はその条件を配列に変換し、Model->findAll() メソッドで使用できるようにします。この場合、array(“Order.destination” => “Old Towne Bakery”) のようになります。

もし用語内で別の SQL オペレータを使用したい場合、第2引数を使用します。

/*
$this->data の内容
array(
    'Order' => array(
        'num_items' => '4',
        'referrer' => 'Ye Olde'
    )
)
*/

// 最低4つの項目があり、 ‘Ye Olde’ を含む orders を取得しましょう
$o = $this->Order->findAll($this->postConditions(
    $this->data,
    array('>=', 'LIKE')
));
  1. /*
  2. $this->data の内容
  3. array(
  4. 'Order' => array(
  5. 'num_items' => '4',
  6. 'referrer' => 'Ye Olde'
  7. )
  8. )
  9. */
  10. // 最低4つの項目があり、 ‘Ye Olde’ を含む orders を取得しましょう
  11. $o = $this->Order->findAll($this->postConditions(
  12. $this->data,
  13. array('>=', 'LIKE')
  14. ));

オペレータを指定したキーの順番は、$this->data 配列内のカラムの順です。num_items は1番目なので、>= オペレータが適用されます。

3番目の引数は、find 条件内でどの SQL 真偽値オペレータを使用するかをCakePHP に知らせます。‘AND’, ‘OR’, ‘XOR’ のような文字列はすべて有効な値です。

最後に、最後の引数に true をセットすると、$op パラメータは配列となり、$op に含まれないフィールドは返される条件に含まれないでしょう。

3.5.3.4.5 paginate

このメソッドを使用すると、モデルからペジネートする結果を取得します。ページサイズ・モデルの find 条件などが指定できます。詳細やペジネートの使用方法については、pagination セクションを見てください。

3.5.3.4.6 requestAction

requestAction(string $url, array $options)

この関数は、なんらかのロケーションを使用してコントローラのアクションを呼び出し、そのアクションの実行結果のデータを返します。$url に渡すのは CakePHP の相対 URL (/controllername/actionname/params) です。受信コントローラのアクションに特別なデータを渡すには、 $options 配列に追加します。

オプションに 'return' を渡すことで requestAction() を使用して、完全にレンダリングされたビューを取得することができます。: requestAction($url, array('return'));

キャッシュせずに使用すると、requestAction はパフォーマンスが悪くなります。まれにコントローラやモデルで使用することが適切な場合があります。

requestAction は(キャッシュされた)エレメントとともに使用されることが一番多いです。 - レンダリングする前にエレメント用のデータを取り出すために使用されるからです。レイアウト内で "latest comments" エレメントを設置する例を見てみましょう。初めにデータを返すコントローラの関数を作成する必要があります。

// controllers/comments_controller.php
class CommentsController extends AppController {
    function latest() {
        return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
    }
}
  1. // controllers/comments_controller.php
  2. class CommentsController extends AppController {
  3. function latest() {
  4. return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'limit' => 10));
  5. }
  6. }

上記の関数を呼び出す簡単なエレメントを作成するには:

// views/elements/latest_comments.ctp

$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
    echo $comment['Comment']['title'];
}
  1. // views/elements/latest_comments.ctp
  2. $comments = $this->requestAction('/comments/latest');
  3. foreach($comments as $comment) {
  4. echo $comment['Comment']['title'];
  5. }

どこにでもエレメントを設置することができます。出力を取得して使用します:

echo $this->element('latest_comments');
  1. echo $this->element('latest_comments');

このように記述すると、エレメントがレンダリングされるときはいつでも、リクエストが生成されコントローラにデータが渡されます。データは処理されてから返されます。しかし注意しなればならないのは、不必要な処理を防ぐためにエレメントのキャッシュを使用することが重要です。エレメントの呼び出しを変更することによって次のようになります。:

echo $this->element('latest_comments', array('cache'=>'+1 hour'));
  1. echo $this->element('latest_comments', array('cache'=>'+1 hour'));

requestAction の呼び出しは、キャッシュされたエレメントのビューファイルが存在し有効である間は生成されなくなります。