4

当特定事件发生时,我需要在我的每个模块中实现一个事件触发器。我还需要在触发该事件时必须执行某些工作的所有其他模块注意它。

我正在尝试创建一些可以发送触发器的通用端点,以及所有模块都需要监听的地方,但是我在弄清楚如何实现这一点时遇到了一些麻烦。

有任何想法吗?

4

2 回答 2

14

根据对@Andrew 的回答的评论,只要您的控制器扩展AbstractActionController(它很可能会这样做)它就已经知道 EventManager,所以您可以继续并在控制器操作中触发您喜欢的任何事件,只需执行...

<?php
namespace Application/Controller;

// usual use statements omitted for brevity ..

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        // trigger MyEvent
        $this->getEventManager()->trigger('MyEvent', $this);
    }

}

要在其他模块的引导程序中收听该事件,请执行以下操作

public function onBootstrap(EventInterface $e)
{
    $app = $e->getApplication();
    // get the shared events manager 
    $sem = $app->getEventManager()->getSharedManager();
    // listen to 'MyEvent' when triggered by the IndexController
    $sem->attach('Application\Controller\IndexController', 'MyEvent', function($e) {
        // do something...
    });
}
于 2013-03-06T09:17:35.010 回答
3

有几篇关于这方面的好文章:

http://www.mwop.net/blog/266-Using-the-ZF2-EventManager.html

http://www.eschrade.com/page/zend-framework-2-event-manager/

让你的模块监听一个应用程序范围的事件,然后在触发时执行一些任务是很容易的。这两个中应该有足够的信息来帮助您入门。

如果你举一个你想要的例子,我可以提供一个例子来说明你如何去做。

于 2013-03-05T17:17:04.690 回答