CakePHP

CakePHP Behaviorのsetup()注意点

CakePHPのビヘイビアでの注意点がひとつありましたのでメモとして。。。

ビヘイビアの「setup()」を利用する際に注意点がありました。
特に気づかずに第2引数を変数などにセットすると、コントローラー内に
2つ以上モデルが存在し、両方に同じビヘイビアを設定した場合、
その設定が上書きされてしまう恐れがあります。

といってもイマイチな説明ですが(汗

CakePHPの1.1から利用して同じ使い方(同じコード)で利用していたということと
その現象になる設計が無かったのが幸いして、発見に至りました(笑

通常は1つのコントローラーに1つのモデルとしてコーディングしていきますが、
設計によっては1つのコントローラーが2つのモデルを利用する場合もあるかと思います。
モデル1対コントローラー1の関係で利用するビヘイビアの設計であればいいのですが
ビヘイビアはモデル多対コントローラー1の考えが基本かと思います。
その例としてコントローラーでは以下の使い方があると思います。

//コントローラー内のモデル設定で
$uses=array('モデル1','モデル2');

この場合、それぞれのモデルに1つのビヘイビアをセットしたとし、
「setup()」の第2引数にも何かしらの設定をセットしたとします。
ビヘイビアでは以下のような処理とすると

function setup(&$model, $config = array()) {
	$this->config = $config;
}

ここで問題発生。。。
この場合「モデル1」のビヘイビアの処理を実行しているのに、通常はモデル1に設定されている
ビヘイビアの第2引数が利用されるのに、実際はモデル2の第2引数を利用しようとします。

どうやらCakePHP1.2の途中からビヘイビアの読み込み方が、若干変更されていたみたいですorz

そこで内部を調べた結果の対応策として以下の方法で対処が可能ということが判明しました。

function setup(&$model, $config = array()) {
	$this->config[$model->alias] = $config;
}

こうするこで、問題なく実行しているモデルの第2引数を参照するようにすることが可能です。
まぁ単純にモデル名で配列化しているというだけにはなります(笑

コメント