【问题标题】:cakephp 3 - trigger controller action with eventcakephp 3 - 用事件触发控制器动作
【发布时间】:2017-01-18 01:02:54
【问题描述】:

我有触发事件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 控制器中实现侦听器接口:

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

但是动作没有被触发。

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

谢谢。 问候。 法昆多。

【问题讨论】:

    标签: cakephp events cakephp-3.0 event-listener


    【解决方案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']
    );
    

    另见

    【讨论】:

    • 感谢您的回答。会试试的。
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2014-04-20
    • 2019-06-20
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多