如何在ZF2中加载Controller之前调用模块功能?

时间:2014-07-08 08:58:51

标签: zend-framework2 event-listener

我希望在控制器加载之前调用模块的功能。我该怎么做?任何想法/链接到这个?我想学习如何添加钩点来控制流程但却无法理解。 基本上,我希望我的聊天模块出现在网站的所有页面上。现在,我必须从每个页面拨打电话来加载它。 有各种MVC事件,如bootstrap,render等。任何这些都可以拯救吗?

如果您需要任何特定代码,请告诉我们。

2 个答案:

答案 0 :(得分:1)

Module.php中,你可以附加一个在呈现任何动作时应该被调用的函数 -

use Zend\Mvc\MvcEvent;                 

use SOME_SERVICE_CLASS_NAME;           //updated line 

class Module {

    public function onBootstrap(MvcEvent $e) {
        $e->getApplication()
                ->getEventManager()
                ->getSharedManager()
                ->attach('*', 'dispatch', array($this, 'FUNCTION_NAME'));
    }

    public function FUNCTION_NAME(MvcEvent $e) {
        //your code for this function

       $sm = $e->getApplication()->getServiceManager();


       //Eg:
       $service = new SOME_SERVICE_CLASS_NAME();   //updated lines
       $service->setServiceLocator($sm);
       $service->methodName(); 
    }

    [rest of the code]
}
  1. '*' - 表示该功能已附加到所有模块的控制器上。

  2. dispatch - 表示在调度时调用的函数(渲染前)

  3. 在渲染视图页面之前将调用FUNCTION_NAME函数。

  4. 请阅读getEventManagergetSharedManager,并将功能附加到事件onBootstrap进行探索。

    修改: 1. use Zend\Mvc\MvcEvent;添加在顶部。

    1. $sm已设置为该服务。

    2. 要在服务类中获取它,该类应该有一个方法 -

      protected $ serviceLocator;

      public function setServiceLocator($ serviceLocator = null){     $ this-> serviceLocator = $ serviceLocator; }

    3. 这样,当您从服务类中调用getServiceLocator()时,它将获得服务定位器。

答案 1 :(得分:0)