Cake PHP 2 通过事件监听器中的模型保存数据
Cake PHP 2 save data via model in Event Listener
我的项目 Lib/Event
目录中有一个事件侦听器和一个名为 QueueManagerJob
.
的模型
我的应用程序在某个时候调度了一个事件,我想通过我的模型将一个条目保存到我的数据库中。当我的事件被调度时,它在侦听器中运行一个 store
方法,我在这里引用我的模型并试图保存它。
我已通过 $uses
数组拉入模型,但出现以下错误:
Call to a member function set() on null
<?php
App::uses('CakeEventListener', 'Event', 'CakeLog');
class DispatchJobListener implements CakeEventListener {
public $uses = array('QueueManagerJob');
public function implementedEvents() {
return array(
'QueueManagerModule.QueueManagerJob.dispatchJob' => 'store'
);
}
/**
* Store the data
*/
public function store($event) {
$event->stopPropagation();
$job = [
'queue' => 'default',
'payload' => json_encode([]),
'attempts' => 0,
'reserved_at' => null,
'available_at' => date('Y-m-d H:i:s'),
'created_at' => date('Y-m-d H:i:s')
];
$this->QueueManagerJob->set($job);
// invalid
if (!$this->QueueManagerJob->validates()) {
// $this->QueueManagerJob->validationErrors;
// ...
}
// save the job
$this->QueueManagerJob->save($job);
}
}
您的 class 仅实现了一个接口,没有进一步的逻辑可以利用 $uses
属性.
$uses
属性 只能被控制器开箱识别,如果你需要在其他地方加载模型,那么你必须使用 ClassRegistry::init()
,例如:
App::uses('ClassRegistry', 'Utility');
// ...
$QueueManagerJob = ClassRegistry::init('QueueManagerJob');
还要注意 App::uses()
只接受两个参数,class 名称和包名称,您的示例中的第三个参数不会做任何事情!
我的项目 Lib/Event
目录中有一个事件侦听器和一个名为 QueueManagerJob
.
我的应用程序在某个时候调度了一个事件,我想通过我的模型将一个条目保存到我的数据库中。当我的事件被调度时,它在侦听器中运行一个 store
方法,我在这里引用我的模型并试图保存它。
我已通过 $uses
数组拉入模型,但出现以下错误:
Call to a member function set() on null
<?php
App::uses('CakeEventListener', 'Event', 'CakeLog');
class DispatchJobListener implements CakeEventListener {
public $uses = array('QueueManagerJob');
public function implementedEvents() {
return array(
'QueueManagerModule.QueueManagerJob.dispatchJob' => 'store'
);
}
/**
* Store the data
*/
public function store($event) {
$event->stopPropagation();
$job = [
'queue' => 'default',
'payload' => json_encode([]),
'attempts' => 0,
'reserved_at' => null,
'available_at' => date('Y-m-d H:i:s'),
'created_at' => date('Y-m-d H:i:s')
];
$this->QueueManagerJob->set($job);
// invalid
if (!$this->QueueManagerJob->validates()) {
// $this->QueueManagerJob->validationErrors;
// ...
}
// save the job
$this->QueueManagerJob->save($job);
}
}
您的 class 仅实现了一个接口,没有进一步的逻辑可以利用 $uses
属性.
$uses
属性 只能被控制器开箱识别,如果你需要在其他地方加载模型,那么你必须使用 ClassRegistry::init()
,例如:
App::uses('ClassRegistry', 'Utility');
// ...
$QueueManagerJob = ClassRegistry::init('QueueManagerJob');
还要注意 App::uses()
只接受两个参数,class 名称和包名称,您的示例中的第三个参数不会做任何事情!