ZF2共享事件

时间:2012-10-30 11:01:34

标签: php zend-framework2

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

模块1:

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

Module2 controller:

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

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

您的附件行应如下所示:

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

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

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

欢呼声,

亚辛