動的にコールバックを設定するObservableビヘイビア

環境: CakePHP 1.3

モデル用のコールバック関数を動的に登録/解除できるようにする Observable Behaviorを作りました。コールバックを使用するためだけにサブクラスを作ったりビヘイビアを作ったりする必要がなくなります。

observable.php – gist
(いずれ正式なリポジトリに移すかもしれない)

callable なオブジェクトなら何でもコールバックとして使用できますが、PHP 5.3のクロージャと組み合わせると特に便利です。

$actsAs = array('Observable');
 
// addObserver メソッドで登録。戻り値は一意なid
$oid = $Model->addObserver('beforeSave', function($model) {
 
    // 第1引数はモデル、それ以後は通常のコールバック引数
    $model->data[$model->alias] = ....;
 
    // false を返すとコールバックの実行が停止する
    // 何も返さなかった場合(null)は true を返したのと同じことになる
    //return false;
});
 
// 不要になったら取り除く
$Model->removeObserver($oid);

コメント中にもある通り、明示的に引数を返さなかった場合は true と見なされるので、 beforeSave や beforeValidate で戻り値を忘れてその後の処理が実行されない……といったことはありません。

Leave a Reply