我希望在控制器加载之前调用模块的功能。我该怎么做?任何想法/链接到这个?我想学习如何添加钩点来控制流程但却无法理解。 基本上,我希望我的聊天模块出现在网站的所有页面上。现在,我必须从每个页面拨打电话来加载它。 有各种MVC事件,如bootstrap,render等。任何这些都可以拯救吗?
如果您需要任何特定代码,请告诉我们。
答案 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]
}
'*'
- 表示该功能已附加到所有模块的控制器上。
dispatch
- 表示在调度时调用的函数(渲染前)
在渲染视图页面之前将调用FUNCTION_NAME
函数。
请阅读getEventManager
和getSharedManager
,并将功能附加到事件onBootstrap
进行探索。
修改:
1. use Zend\Mvc\MvcEvent;
添加在顶部。
$sm
已设置为该服务。
要在服务类中获取它,该类应该有一个方法 -
protected $ serviceLocator;
public function setServiceLocator($ serviceLocator = null){ $ this-> serviceLocator = $ serviceLocator; }
这样,当您从服务类中调用getServiceLocator()
时,它将获得服务定位器。
答案 1 :(得分:0)
init()
和onBootstrap()
,我倾向于使用onBootstrap()
https://github.com/tawfekov/ZF2EntityAudit/blob/master/Module.php 你可以查看这个有用的资源