忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

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