如何将对象实例分配给行为?

时间:2013-01-31 22:46:07

标签: php cakephp cakephp-2.2

我努力让我的Behavior类在回调中使用对象实例。

class SomethingBehavior extends ModelBehavior
{
     public function setObject($obj)
     {
         // do stuff
     }

     public function afterFind(Model $model,$results,$primary)
     {
        // use the $obj reference set above
     }
}

现在我需要Model类在执行任何find操作之前调用setObject(..)。理想情况下,我只需在构造函数中分配我需要的对象。

class Document extends AppModel
{
    //.....
    public function __construct($id,$table,$ids)
    {
        parent::__construct($id,$table,$ds);
        $this->Something->setObject(new MyClass());
    }
}

我的问题是尚未配置Behavior对象,并且在尝试使用它时我得到的不是对象错误。

我无法为组件中的模型找到任何回调方法。例如,没有setupinitialize方法。

如何将我需要的对象分配给行为?

2 个答案:

答案 0 :(得分:2)

你似乎没有多少与行为合作过。尝试使用可包含的,树或其他核心或插件行为,然后您很快就会找出基础知识。

首先,行为附加到模型上(并且从2.3:加载),而不是相反。然后一个模型变得越来越丰富"在功能上。

静态使用public $actsAs或动态使用

$this->Behaviors->attach('Something'); // since 2.3: load() instead of attach()

它可以直接访问行为方法。让我们说你的行为中有一个方法foo()。 然后,您可以从模型中将其称为

$this->foo($foo, $bar);

或者从您的控制器

$this->Document->Behaviors->attach('Something')
$this->Document->foo($foo, $bar);

太棒了吧? 行为方法通常有这个声明:

public function foo(Model $Model, $foo, $bar) {
    $alias = $Model->alias;
    // do sth
}

如您所见,您总是隐式地将模型传递给它(因为第一个参数自动传递)。 您可以访问其所有属性。

不要触摸模型的构造函数。没必要那样做。

如果你真的需要在运行时传递一个对象,为什么你的方法不起作用?

public function setObject(MyClass $obj) {
    $this->Obj = $obj;
}

现在,您可以在内部使用行为方法中的对象

public function doSth(Model $Model) {
    $this->Obj->xyz();
}

这也许不是最优雅的方法。

答案 1 :(得分:1)

您永远不会设置Document类的something成员。您需要在构造函数中实例化它,或者将其传入。

就个人而言,我会做这样的事情:

class Document extends AppModel
{
    private $behavior;

    public function __construct($id,$table,$ids, ModelBehavior $behavior)
    {
        parent::__construct($id,$table,$ds);
        $this->behavior = $behavior
        $this->behavior->setObject(new MyClass());
    }
}

$doc = new Document(..., new SomethingBehavior());

或者更好的是,您甚至可以通过以下方式将其进一步分开:

class Document extends AppModel
{
    private $behavior;

    public function __construct($id,$table,$ids, ModelBehavior $behavior)
    {
        parent::__construct($id,$table,$ds);
        $this->behavior = $behavior
    }
}

$behavior = new SomethingBehavior();
$behavior->setObject(new MyClass());

$doc = new Document(..., $behavior);

这样,构造函数中的魔法就会减少。