【问题标题】:ZF2 getServiceLocator() not found?没有找到 ZF2 getServiceLocator()?
【发布时间】:2013-08-14 15:50:44
【问题描述】:

我一辈子都无法让 $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 

【问题讨论】:

标签: php zend-framework2


【解决方案1】:

让我的评论更有意义。 ServiceLocator(或更确切地说是所有 ControllerPlugins)仅在 Controller 生命周期的后期可用。 如果您希望分配一个可以在整个操作中轻松使用的变量,我建议使用 Lazy-Getters 或使用 Factory Pattern

注入它们

懒惰的人

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;
}

希望这是可以理解的;)

【讨论】:

    【解决方案2】:

    我认为是因为你的Controller没有实现ServiceLocatorAwareInterface的接口。你可以在construct方法中看到类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。

    【讨论】:

    • 您可以清楚地看到,他正在扩展AbstractActionController,但是,您可以看到,Initializers 不是在控制器__construct() 上调用的,而是在之后 它们已被初始化。只有在设置器功能可用之后。因此,在控制器 __construct() 的时候,根本没有注入依赖项,因此你不能在那个时间点使用任何 ControllerPlugins。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-04-03
    • 2015-12-25
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多