Zend framework2 在ZF2中加载控制器之前,如何调用模块函数?

Zend framework2 在ZF2中加载控制器之前,如何调用模块函数?,zend-framework2,event-listener,Zend Framework2,Event Listener,我想在控制器加载之前调用模块的函数。我该怎么办?有什么想法/链接吗?我想学习如何添加钩子点来控制流,但没有太多的想法。 基本上,我希望我的聊天模块出现在网站的所有页面上。现在,我必须从每个页面打电话来加载它。 有各种各样的MVC事件,如引导、渲染等。这些事件中的任何一个能起到拯救作用吗 如果你需要任何特定的代码,一定要告诉我 您有两个选择: init()和onBootstrap(),我倾向于使用onBootstrap() 您可以查看这些有用的资源 在Module.php中的onBootst

我想在控制器加载之前调用模块的函数。我该怎么办?有什么想法/链接吗?我想学习如何添加钩子点来控制流,但没有太多的想法。 基本上,我希望我的聊天模块出现在网站的所有页面上。现在,我必须从每个页面打电话来加载它。 有各种各样的MVC事件,如引导、渲染等。这些事件中的任何一个能起到拯救作用吗

如果你需要任何特定的代码,一定要告诉我

您有两个选择:
init()
onBootstrap()
,我倾向于使用
onBootstrap()

您可以查看这些有用的资源


  • Module.php
    中的
    onBootstrap()

    示例中,您可以附加一个函数,在呈现任何操作时应调用该函数-

    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]
    }
    
  • “*”
    -表示该函数已连接到所有模块的控制器

  • 分派
    -表示分派时要调用的函数(渲染前)

  • 在呈现视图页面之前,将调用
    FUNCTION\u NAME
    函数

  • 请阅读
    getEventManager
    getSharedManager
    以及将函数附加到事件
    onBootstrap
    以进行探索

    编辑: 1. <代码>使用Zend\Mvc\MvcEvent添加在顶部

  • $sm
    已设置为该服务

  • 要在服务类中获得它,该类应该有一个方法-

    受保护的$serviceLocator

    公共函数setServiceLocator($serviceLocator=null){ $this->serviceLocator=$serviceLocator; }


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

    如果我的函数在另一个文件中?我制作了一个具有此功能的模块服务文件。在
    function\u NAME
    代码中,创建该服务的对象并调用该方法。请确保在
    类模块{..
    行上方包含
    use..
    语句。如果服务需要一些依赖项,请也提供它们。答案中包含示例。请检查。我这样做了,它也可以工作。但是当我尝试调用此
    “$sm=$this->getServiceLocator();$this->albumTable=$sm->get('Album\Model\albumTable');
    I get'调用成员函数get()在非对象上。您知道可能的原因吗?^这在调用的函数中。更新了答案。在
    Module.php
    本身中获取服务定位器,并通过
    setServiceLocator()
    将其传递给服务类文件。