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 名称和包名称,您的示例中的第三个参数不会做任何事情!