CakePHP1.2 Behaviorで気をつけること
Behaviorを使っていて、一瞬ハマったのでメモ
<?php class HogeBehavior extends ModelBehavior { var $config = array(); function setup(&$model, $config=array()) { $this->config = $config; } } ?>
上記のようなBehaviorを、次のようなModelから呼び出すとする
<?php class A extends AppModel { var $name = 'A'; var $actsAs = array('Hoge'=>array('foo'=>'aaa'); } class B extends AppModel { var $name = 'B'; var $actsAs = array('Hoge'=>array('foo'=>'bbb'); } ?>
この2つのModelが呼び出されるメソッドを実行するとき、
次のようにデバッグを表示させると
<?php class HogeBehavior extends ModelBehavior { var $config = array(); function setup(&$model, $config=array()) { $this->config = $config; debug($this->config); } } ?>
Array ( [foo] => aaa ) Array ( [foo] => bbb )
おや?上書きされてる・・・
この状態で、AModelでHogeBehaviorのメソッドを使用すると、
BModelで設定した値が入ってしまい。悲しい思いをします。
そこで、以下のようにして回避することにしました。
<?php class HogeBehavior extends ModelBehavior { var $config = array(); function setup(&$model, $config=array()) { $this->config[$model->alias] = $config; debug($this->config); } } ?>
こうすると
Array ( [A] => Array ( [foo] = aaa ) [B] => Array ( [foo] = bbb ) )
メソッド内で使用するときは、$this->config[$model->alias]で呼び出せばOK