Zend framework2 从抽象控制器工厂中访问依赖项

Zend framework2 从抽象控制器工厂中访问依赖项,zend-framework2,abstract-factory,Zend Framework2,Abstract Factory,我的应用程序中的大多数控制器都需要能够访问当前登录用户的“帐户”,因此我尝试将其注入到每个控制器类中。实现这一点的方法似乎是为控制器类创建一个抽象工厂,它可以提供所有依赖项。因此,我创建了factory类,其中包含一个方法: public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) { $controllerClassName = $reque

我的应用程序中的大多数控制器都需要能够访问当前登录用户的“帐户”,因此我尝试将其注入到每个控制器类中。实现这一点的方法似乎是为控制器类创建一个抽象工厂,它可以提供所有依赖项。因此,我创建了factory类,其中包含一个方法:

public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
    $controllerClassName = $requestedName.'Controller';

    $controller = new $controllerClassName();

    $account = $serviceLocator->get('Account');
    $controller->setAccount($account);

    return $controller;
}
然而,
$serviceLocator->get('Account')行显示错误:

Zend\Mvc\Controller\ControllerManager::get无法获取或创建帐户的实例

在控制器操作中调用
$this->getServiceLocator()->get('Account')
效果很好,那么为什么这个调用在控制器工厂中不起作用呢

或者,有没有更好的方法来实现这一点?

查看错误

Zend\Mvc\Controller\ControllerManager::get无法获取或创建帐户的实例

ControllerManager
没有名为
Account
的服务,它只有控制器。您需要从控制器管理器获取主服务定位器

$account = $serviceLocator->getServiceLocator()->get('Account');
或者,有没有更好的方法来实现这一点

就我个人而言,我发现更好的方法是使用控制器插件作为代理来包装服务

首先,使用接受服务实例作为其参数的构造函数创建插件

<?php
namespace Application\Controller\Plugin;

use Zend\Mvc\Contoller\Plugin\AbstractPlugin;

class Account extends AbstractPlugin
{
    protected $account;

    public function __construct($account)
    {
         $this->account = $account;
    }

    // .. write plugin methods to proxy to your service methods 

    public function getId()
    {
        return $this->account->getId();
    }
}
最后,在您的控制器(任何控制器)中,您可以调用插件方法来访问您的服务

 public function actionIndex()
 {
     $accountId = $this->account()->getId();
 }

谢谢,我想可能是这样的。也将使用控制器插件方法。
 public function actionIndex()
 {
     $accountId = $this->account()->getId();
 }