0

我试图在一个模块中设置一个事件并在另一个模块的控制器中触发它。我正在使用共享事件管理器,但似乎我做错了什么..

模块1:

public function onBoostrap(Event $e)
        {
              $sem = $e->getTarget()->getEventManager()->getSharedEventManager();
              $sem->attach('checkSomething', function (){
                          die("checked");
              });
        }

模块2控制器:

 public function checkAction ()
        {
                $this->getEventManager()->trigger('checkSomething');
}

你们知道我可能做错了什么吗?或者,如果有更好(正确)的方法来做到这一点..

4

2 回答 2

3

Yassine 解决方案中的问题是事件附加在“Zend\Mvc\Application”上。此事件标识符在您的控制器中不可用

您可以通过在操作中执行以下代码来验证这一点

print_r($this->getEventManager()->getIdentifiers());

结果将类似于

Array ( 
    [0] => Zend\Stdlib\DispatchableInterface 
    [1] => Zend\Mvc\Controller\AbstractController 
    [2] => Application\Controller\TestController 
    [3] => Zend\Mvc\Controller\AbstractActionController 
    [4] => Application 
)

现在要解决您模块中的问题,请将事件附加到“应用程序”标识符,然后在操作中触发您的事件。

所以:

/*Module*/
public function onBootstrap($e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $sem          = $eventManager->getSharedManager();

    $sem->attach('Application', 'checkSomething', function () {
        echo "checked";
        /* do more stuff here */
    }, 100);

}
/* a action in a controller */
$this->getEventManager()->trigger('checkSomething');

这应该导致

checked

所以你已经成功触发了这个事件。

于 2013-03-30T18:00:22.343 回答
0

您需要指定包含事件管理器实例的资源的标识符。许多类(Application、ModuleManager...)在其包含的 EventManager 实例中使用它们的类名作为标识符。

您的附件行应如下所示:

$sem->attach('Zend\Mvc\Application','checkSomething', function (){
                      die("checked");
          });

(更新)您应该从控制器调用应用程序 EventManager:

$this->getServiceLocator()->get('application')->getEventManager()->trigger('chec‌​kSomething');

干杯,

亚辛

于 2012-10-30T14:23:30.623 回答