[ステップアップ! CakePHP] Model で Behavior を使う
W 杯に向けて CS 放送契約しました!nakamura です。でもケーブルテレビだと、まだあまりフルハイビジョン対応していないんですねぇ、、、
今回は CakePHP 連載の 2 回目、第 1 回の Component に続いて Behavior のお話しをします。データアクセス周りで共通して使う機能を 1 箇所にまとめたい場合 Behavior はうってつけの方法です。まだ、あまりうまく使えていない方、ぜひ参考にしてみてください!
Behavior って?
Controller でいう Component と同様の役割を Model に対して提供します。特定のモデルに依存しない汎用的な機能を記述する事で、どのモデルからでも同じようにその機能にアクセスする事が可能になります。
設置場所
app/models/behaviors 以下に設置します。
命名規則
命名規則も基本的には Component と同じルールです。クラス名から Behavior という文字列を除外し、camel_case 形式にしたものがファイル名になります。
例) Class CustomValidationBehavior は custom_validation.php になります。
コアビヘイビア
コンポーネントと同様にビヘイビアにも標準で実装されているものがあります。詳細は以下の URL を参照してください。
ビヘイビアを自作する
基本的な事はここまでにして、実際に独自のビヘイビアを作成してみましょう!今回は CustomValidationBehavior に独自のバリデーションメソッドを作成し、それをモデルから呼び出す方法をご紹介します。
app/models/behaviors/custom_validation.php
<?php
/**
* 独自のバリデーションメソッドを記述するビヘイビアクラス。
*/
class CustomValidationBehavior extends ModelBehavior {
/**
* 文字列が全角カタカナのみかどうかの判定。
*
* @param object $model モデルオブジェクト
* @param array $data バリデート対象のデータ配列
* @return boolean 全角カタカナのみであればTRUE。違えばFALSE。
*/
function isKatakana(&$model, $data) {
$value = current($data);
if (!preg_match("/^[ァ-ヶー]+$/u", $value)) {
return false;
}
return true;
}
?>
簡単なカタカナ判定のメソッドを実装します。ビヘイビアはかならず ModelBehavior クラスを継承しないといけない点に注意してください。
モデル側の記述は以下のようになります。
<?php
/**
* posts テーブルにアクセスする為のモデルクラス。
*/
class Post extends AppModel {
var $name = "Post";
var $actsAs = array("CustomValidation");
/**
* バリデーションルール
*/
var $validate = array(
"ruby" => array(
"notEmpty" => array(
"rule" => "notEmpty",
"allowEmpty" => false,
"message" => "フリガナを入力してください。"
),
// ここでカタカナ判定
"isKatakana" => array(
"rule" => array("isKatakana"),
"allowEmpty" => false,
"message" => "フリガナは全角カタカナで入力してください。"
)
)
);
}
?>
コンポーネントの場合は var $components とそのまんまでしたが、ビヘイビアの場合は var $actsAs になるのでご注意ください。 $actsAs に記載されたビヘイビアのメソッドには自身に書かれたものと同じようにアクセスする事が可能です。(要は app_model.php 内に書くのと同様の動きになります。)ですので当然、バリデーションメソッド以外のものを記述して $this-> でアクセスする事もできます。
最後に
ビヘイビアを使う事でデータアクセス周りの汎用的なメソッドを機能毎に分けて書く事が可能になります。app_model.php にずらずらと書くよりはよほどスマートな記述ができるはずなので、ぜひ活用してみてください。