cakephp 3 - 用事件触发控制器动作

时间:2017-01-17 16:20:18

标签: cakephp events cakephp-3.0 event-listener

我有触发事件SlsInvoices的模型SlsDispatches.send。 然后在我的SlsInvoicesController内,我有一个名为emit的动作。

我需要在emit事件上触发SlsDispatches.send操作。

SlsInvoices模型将事件触发为:

$event = new Event('SlsDispatches.send', $this, [ 'dispatchId' => $dispatchId ] );

$this->eventManager()->dispatch( $event );

但是我无法注册一个监听器来制作emit动作触发器。 我尝试过使用:

$this->eventManager()->on( 'SlsDispatches.send', $this->processSentDispatch() );

其中$this->processSentDispatch()是进一步调用emit的操作。

此外,我尝试使用以下方法在de controller中实现侦听器接口:

public function implementedEvents()
{
    return [
        'SlsDispatches.send => 'processSentDispatch',
    ];
}

但是没有触发行动。

有可能做我想要的吗?我错过了什么?

感谢。 问候。 法昆

1 个答案:

答案 0 :(得分:1)

实例级事件管理器(即$this->eventManager())不会侦听其他实例级事件管理器的事件。如果要从保存事件管理器实例的对象外部侦听本地调度的事件,则需要通过对象事件管理器订阅它:

$SlsInvoicesObject->eventManager()

或通过全球的:

\Cake\Event\EventManager::instance()

此外,您无法以显示它的方式传递回调,您正在执行的操作是调用方法,并将其返回值传递给on()方法。

长话短说,你需要做一些事情:

$SlsInvoicesObject->eventManager()->on(
    'SlsDispatches.send',
    [$this, 'processSentDispatch']
);

\Cake\Event\EventManager::instance()->on(
    'SlsDispatches.send',
    [$this, 'processSentDispatch']
);

另见