ZF2:将事件附加到另一个Controller的Action并获取Service Locator

时间:2013-10-31 01:15:58

标签: events zend-framework2 config

我是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()

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

1 个答案:

答案 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中删除逻辑并在服务类或其他内容中找到它。