我是Zend Framework 2的新手。我有两个模块'A'和'B'。我在LoginController的“A”模块的LoginAction中触发一个事件。我想附加LoginController的LoginAction或LoginController的testMe()方法。
在“A”模块的LoginController的LoginAction中,我写了
$this->getEventManager()->trigger('checkme.post', null, array('user_id' => $userData->usydstudentid));
在“B”模块的Module.php中,在Bootstrap方法中,我已经给出了
$loginController = new B\Controller\LoginController();
$sharedEventManager->attach('A\Controller\LoginController', 'checkme.post', array($loginController, 'LoginAction'), 100);
在LoginController的“B”模块的LoginAction中,我可以访问数据,但我无法访问服务管理器以获取模块的配置。当我尝试使用
时$this->getServiceLocator()->get('Config');
我收到错误
在非对象上调用成员函数get()
换句话说,我想从一个控制器的方法触发事件并附加到另一个控制器的方法。听完之后,从那个事件中获取数据,我想得到模块的配置。请帮忙。
答案 0 :(得分:3)
首先,您不应该以这种方式使用事件和控制器。 B中的控制器不是控制器,但您应将其放在服务层中。
然后,必须注入服务定位器。如果您执行$controller = new SomeController
,则不会注入此服务定位器。因此,从中获取任何对象将失败。你应该做的是使用控制器加载器来获取控制器。
所以不要这样:
$loginController = new B\Controller\LoginController();
$sharedEventManager->attach('A\Controller\LoginController',
'checkme.post',
array($loginController, 'LoginAction'),
100);
你应该这样写:
// $sl is instance of Service Locator
// E.g. $sl = $e->getApplication()->getServiceManager();
// Where $e is the event from the onBootstrap() method
$loader = $sl->get('ControllerLoader');
$loginController = $loader->get('B\Controller\LoginController');
$sharedEventManager->attach('A\Controller\LoginController',
'checkme.post',
array($loginController, 'LoginAction'),
100);
但正如所说的那样,通过事件以这种方式触发控制器中的动作并不是一个很好的方法。您最好使用控制器插件Forward
或(如前所述)调度它,从控制器的LoginAction中删除逻辑并在服务类或其他内容中找到它。