0

我是 Zend Framework 2 的新手。我有两个模块“A”和“B”。我在“A”模块的 LoginController 的 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); 

在“B”模块的 LoginController 的 LoginAction 中,我可以访问数据但我无法访问服务管理器以获取模块的配置。当我尝试使用

$this->getServiceLocator()->get('Config');

我收到错误

在非对象上调用成员函数 get()

换句话说,我想从一个控制器的方法触发一个事件并附加到另一个控制器的方法。听完,从那个事件中获取数据,我想获取模块的配置。请在这方面提供帮助。

4

1 回答 1

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 中删除逻辑并将其定位在服务类或其他东西中。

于 2013-10-31T07:53:15.743 回答