7.2. コントローラの関数

[重要] 重要

このセクションでは、Cake のコントローラでよく使用する関数について扱いますが、完全なリファレンスが http://api.cakephp.org にあります。利用してください。

7.2.1. ビューとのやりとり

set($var, $value);
string $var;
mixed $value;

この関数は、コントローラからビューにデータを渡すもっとも主要な方法です。一つの値、配列全体など、どんなものでも渡すことができます。set() で1度設定すると、ビューの中で変数が使用できるようになります。コントローラで set('color', 'blue') を実行すると、ビューの中で、 $color 変数が使用できるようになります。

validateErrors();
;

保存に失敗時に、エラーの数を返します。

validate();
;

モデルのバリデーションルールに基づいて、モデルのデータを検証します。バリデーションについては、 "データバリデーション"の章を参照してください。

render(     
  $action,  
  $layout,  
  $file);  
  $action;
  $layout;
  $file;

render によってビューが呼ばれます。コントローラのアクションの最後に render が自動的に呼ばれ、アクション名に基づいてビューが自動的に render (表示)されるので、この関数を使用することはそれほど多くないかもしれません。また別のやり方として、コントローラロジックのどの時点であっても、ビューの表示用にこの関数を呼ぶこともできます。

7.2.2. ユーザリダイレクト

redirect($url);
string $url;

この関数で、移動するべき場所を指定できます。 Cake の内部 URL か、完全な URL (http://...) を指定できます。

flash(     
  $message,  
  $url,  
  $pause);  
  $message;
  $url;
  $pause;

この関数は、 $message (メッセージ)を $pause 秒だけ、 flash レイアウトの中で( app/views/layouts/flash.thtmlで定義されます。)表示し、その後、ユーザの指定する $url にリダイレクトします。

7.2.3. コントローラのコールバック

Cake のコントローラには幾つかのコールバックがあり、コントローラの重要な関数の前後にロジックを挿入することができます。この機能を使用するには、コントローラの中でこれらの関数を定義してください。

beforeFilter();
;

コントローラアクション前に毎回、呼ばれます。アクティブなセッションのチェックや、役割(権限)チェックなどに活用できます。

afterFilter();
;

コントローラのアクション後に毎回、呼ばれます。

beforeRender();
;

コントローラのロジックが終わり、ビューが render (表示)される直前に呼ばれます。

7.2.4. その他の便利な関数

これらは Cake のオブジェクトクラスの関数ですが、コントローラ内でも使用できます。

requestAction($url, $extra);
string $url;
array $extra;

この関数は、どんな場所からもコントローラのアクションを呼ぶことができ、render されたビューを返します。 $url は、 Cake URL (/controllername/actionname/params) で指定します。 $extra 配列の中に 'return' キーが含まれている場合、 コントローラアクションのために、AutoRender が自動的に true に設定されます。

requestAction を使用すると、他のコントローラアクションからデータを取得したり、あるコントローラから完全に render されたビューを取得したりできます。

まず、データは、コントローラからシンプルな方法で取得できます。

// シンプルなコントローラ:

class UsersController extends AppController
{
    function getUserList()
    {
        return $this->User->findAll();
    }
}

このシステムのユーザ一覧を表示するシンプルなテーブルを作成する必要があるとします。別のコントローラで同じコードを繰り返すのではなく、requestAction() を使って UsersController::getUserList() からデータを取得できます。

class ProductsController extends AppController
{
    function showUserProducts()
    {
        $this->set('users', $this->requestAction('/users/getUserList'));

        // ビューの $users 変数には、
        // UsersController::getUserList() からのデータが入る
    }
}

固定表示ではない element (要素)がたびたび必要になる場合、 requestAction() を使用してビューの中に注入(インジェクト)できます。単にデータを UsersController::getUserList で受け取るだけでなく、そのアクションの中で render されたビュー(テーブルの形になっているもの)を付け取りたいとしましょう。そうすれば、コードを繰り返さなくてすみます。

class ProgramsController extends AppController
{
    function viewAll()
    {
        $this->set('userTable', $this->requestAction('/users/getUserList', array('return')));

        // このアクションのビューの中から $userTable を呼び出して
        // /users/getUserList で利用できる表示ビューと同じものを echo できます。
    }
}

requestAction() を使用して呼ばれたアクションは、空の layout を使って render されることに注意してください。これにより、layout の中に layout が表示される危険を心配する必要がありません。

requestAction() 関数は AJAX を用いる際にも便利です。AJAX 更新の前、またはその最中に、小さなビューの要素を出力することができます。

log($message, $type = LOG_ERROR);
string $message;
int $type = LOG_ERROR;

WEB アプリケーションの中で起こる様々な出来事を、この関数で記録(log)することができます。Log は、Cake の /tmp ディレクトリの中にあります。

$type が PHP の定数の LOG_DEBUG と同じ場合、デバッグメッセージとしてログに記録されます。その他のタイプのものは、エラーとして記録されます。

// コントローラ内部では log() で項目を書き込めます:

$this->log('緊急!緊急!');

//ログエントリ:

06-03-28 08:06:22 Error: 緊急!緊急!

$this->log(" {$_SESSION['user']} がログインしました。", LOG_DEBUG);

//ログエントリ:

06-03-28 08:06:22 Debug: ボビーがログインしました。

postConditions($data);
array $data;

$this->data に渡せるメソッドで、モデルの conditions 配列を戻します。

例えば、 person の検索フォームがあるとします:

// app/views/people/search.thtml:

input('Person/last_name'); ?>

この要素をフォームで送信すると、 $this->data 配列には次のように返ってきます:

Array
(
    [Person] => Array
        (
            [last_name] => アンダーソン
        )
)

この時点で、 postConditions() を使って、データをモデル内で使用できるようにフォーマットできます:

// app/controllers/people_controller.php:

$conditions = $this->postConditions($this->data);

// 次のような配列を生成します。

Array
(
    [Person.last_name] => アンダーソン
)

// これをモデルの find 操作でこのように使用できます:

$this->Person->findAll($conditions);