0

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

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

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

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

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

我的问题是尚未配置 Behavior 对象,并且在尝试使用它时出现 not an object 错误。

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

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

4

2 回答 2

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();
}

此外,这可能不是最优雅的方法。

于 2013-01-31T23:35:03.993 回答
1

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

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

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);

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

于 2013-01-31T23:17:34.037 回答