2

我有一些麻烦,我需要初始化一些 RouteGuard:

RouteGuard.php

namespace Acl\Guard;

class RouteGuard {
    public function __construct(EntityManager $em)
    {

    }
}

模块.php

.........
class Module {
   public function onBootstrap(MvcEvent $e)
   {
      $sm = $e->getApplication()->getServiceManager();
      $eventManager = $e->getApplication()->getEventManager();
      $eventManager->attach($sm->get('di')->get('Acl\Guard\RouteGuard'));
   }
.....

我得到了这个例外:

  1. 致命错误:未捕获的异常 'Zend\Di\Exception\RuntimeException' 带有消息“无效的实例化器类型为“NULL”,用于“Doctrine\ORM\EntityManager”。在 [projectDir]/vendor/zendframework/zendframework/library/Zend/Di/Di.php 第 767 行
  2. Zend\Di\Exception\RuntimeException: "Doctrine\ORM\EntityManager" 类型为 "NULL" 的无效实例化器。在 [projectDir]/vendor/zendframework/zendframework/library/Zend/Di/Di.php 第 298 行
  3. Zend\Di\Exception\MissingPropertyException:第 767 行 [projectDir]/vendor/zendframework/zendframework/library/Zend/Di/Di.php 中 Acl\Service\AclService::__construct 的参数 entityManager 缺少实例/对象

我知道我尝试 get(Doctrine\ORM\EntityManager) 并且 DI 尝试创建新实例并出错,因为 EntityManager 有一个受保护的构造函数。我知道 EntityManager 应该使用静态方法::create 进行实例化,但我看到 DoctrineORMModule 已经有一个 Doctrine\ORM\EntityManager 的实例,其中包含 Doctrine 的配置,那么我如何在 Bootstrap 中使用 DI 获取这个实例?

提前致谢。

4

1 回答 1

0

我认为在 RouteGuard 类中获取实体管理器的最佳方法是实现 ServiceLocatorAwareInterface,然后始终从服务定位器中检索 RouteGuard 类。

RouteGuard.php

namespace Acl\Guard;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManagerAwareTrait;

class RouteGuard implements ServiceManagerAwareInterface {
    use ServiceLocatorAwareTrait;

    public function __construct()
    {

    }

    public function getEntityManager()
    {
        return $this->getServiceManager()->get('Doctrine\ORM\EntityManager');
    }

}

然后在 RouteGuard 中,您可以调用 $this->getEntityManager() 来检索实体管理器。

于 2014-05-23T18:58:50.163 回答