我不能为我的生活得到$ this-> getServiceLocator()在我的控制器中工作。我已经阅读并尝试了一切。我猜我错过了什么?这是一些代码。
namespace Login\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\Container as SessionContainer;
use Zend\Session\SessionManager;
use Zend\View\Model\ViewModel;
use Zend\Mvc\Controller;
use Login\Model\UserInfo;
class LoginController extends AbstractActionController
{
private $db;
public function __construct()
{
$sm = $this->getServiceLocator();
$this->db = $sm->get('db');
}
...
我得到的错误是:
Fatal error: Call to a member function get() on a non-object in /product/WishList/module/Login/src/Login/Controller/LoginController.php on line 21
答案 0 :(得分:5)
让我的评论更具意义。 ServiceLocator(或者更确切地说,所有ControllerPlugins)仅在Controller的生命周期的稍后时间点可用。 如果您希望分配一个可以在整个操作中轻松使用的变量,我建议使用 Lazy-Getters 或使用工厂模式
注入它们<强>懒惰干将强>
class MyController extends AbstractActionController
{
protected $db;
public function getDb() {
if (!$this->db) {
$this->db = $this->getServiceLocator()->get('db');
}
return $this->db;
}
}
<强>出厂模式强>
//Module#getControllerConfig()
return array( 'factories' => array(
'MyController' => function($controllerManager) {
$serviceManager = $controllerManager->getServiceLocator();
return new MyController($serviceManager->get('db'));
}
));
//class MyController
public function __construct(DbInterface $db) {
$this->db = $db;
}
希望这是可以理解的;)
答案 1 :(得分:0)
我认为这是因为你的Controller没有实现ServiceLocatorAwareInterface的接口。你可以在构造方法中看到类Zend \ ServiceManager \ AbstractPluginManager:
public function __construct(ConfigInterface $configuration = null)
{
parent::__construct($configuration);
$self = $this;
$this->addInitializer(function ($instance) use ($self) {
if ($instance instanceof ServiceLocatorAwareInterface) {
$instance->setServiceLocator($self);
}
});
}
所以如果你想使用ServiceLocator,你必须实现它,或者扩展它已经实现了ServiceLocatorAwareInterface的Zend \ Mvc \ Controller \ AbstractActionController类。