【发布时间】:2015-10-20 18:30:02
【问题描述】:
我想在我的自定义插件中获取服务定位器。我通过 Module.php 中的工厂创建它:
public function getControllerPluginConfig() {
return [
'factories' => [
'Application\Plugin\AppPlugin' => function($serviceManager) {
$serviceLocator = $serviceManager->getServiceLocator();
$appPlugin = new \Application\Plugin\AppPlugin();
$appPlugin->setLocator($serviceLocator);
return $appPlugin;
}
]
];
}
...和我的插件:
<?php
namespace Application\Plugin;
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
class AppPlugin extends AbstractPlugin {
protected $locator;
public function getAppInfo() {
$config = $this->locator->get('Config');
}
/**
* Set Service Locator
* @param \Zend\ServiceManager\ServiceManager $locator
*/
public function setLocator($locator) {
$this->locator = $locator;
}
}
然后我在控制器中调用 getAppInfo():
$appPlugin = new AppPlugin();
$appPlugin->getAppInfo();
...我得到了错误:
Fatal error: Call to a member function get() on a non-object in /vagrant/app/module/Application/src/Application/Plugin/AppPlugin.php on line 13
Call Stack
# Time Memory Function Location
1 0.0027 232104 {main}( ) ../index.php:0
2 0.6238 3166904 Zend\Mvc\Application->run( ) ../index.php:21
3 1.4410 5659112 Zend\EventManager\EventManager->trigger( ) ../Application.php:314
4 1.4410 5659112 Zend\EventManager\EventManager->triggerListeners( ) ../EventManager.php:205
5 1.4411 5660872 call_user_func ( ) ../EventManager.php:444
6 1.4411 5661440 Zend\Mvc\DispatchListener->onDispatch( ) ../EventManager.php:444
7 1.4505 5704600 Zend\Mvc\Controller\AbstractController->dispatch( ) ../DispatchListener.php:93
8 1.4505 5705080 Zend\EventManager\EventManager->trigger( ) ../AbstractController.php:118
9 1.4505 5705080 Zend\EventManager\EventManager->triggerListeners( ) ../EventManager.php:205
10 1.4507 5716656 call_user_func ( ) ../EventManager.php:444
11 1.4507 5716784 Zend\Mvc\Controller\AbstractActionController->onDispatch( ) ../EventManager.php:444
12 1.4508 5717504 Application\Controller\IndexController->indexAction( ) ../AbstractActionController.php:82
13 1.4641 5727768 Application\Plugin\AppPlugin->getAppInfo( ) ../IndexController.php:21
但如果我从控制器传递服务定位器,它工作正常:
$appPlugin = new AppPlugin();
$appPlugin->setLocator($this->getServiceLocator());
$appPlugin->getAppInfo();
如果有人能解释我做错了什么,我会很高兴。谢谢。
【问题讨论】:
标签: php zend-framework2 factory service-locator