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

cakephp 3 - trigger controller action with event

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

的动作

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

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',
    ];
}

但是没有触发动作。

有没有可能做我想做的事?我错过了什么?

谢谢。 问候。 法昆多.

实例级事件管理器,即$this->eventManager(),不监听其他实例级事件管理器的事件。如果你想从持有事件管理器实例的对象外部监听本地调度的事件,那么你需要通过对象事件管理器订阅它:

$SlsInvoicesObject->eventManager()

或通过全局的:

\Cake\Event\EventManager::instance()

此外,您不能按照显示的方式传递回调,您在那里所做的是调用该方法,并将其 return 值传递给 on() 方法。

长话短说,您需要执行以下操作:

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

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

另见