我努力让我的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对象,并且在尝试使用它时我得到的不是对象错误。
我无法为组件中的模型找到任何回调方法。例如,没有setup
或initialize
方法。
如何将我需要的对象分配给行为?
答案 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);
这样,构造函数中的魔法就会减少。