Doctrine orm 如何使用doctrine2zf2在视图帮助器中获取实体管理器

Doctrine orm 如何使用doctrine2zf2在视图帮助器中获取实体管理器,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,以下代码在AbstractPlugin中运行良好,但我需要在view helper中访问实体管理器。如何在视图助手中获取实体管理器 是否有办法将entityManager实例保存在注册表中的某个位置,以便我可以随时访问它?这是一个好的做法吗 use Zend\View\Helper\AbstractHelper; use Doctrine\ORM\EntityManager; use Zend\ServiceManager\ServiceManagerAwareInterface; use Ze

以下代码在AbstractPlugin中运行良好,但我需要在view helper中访问实体管理器。如何在视图助手中获取实体管理器

是否有办法将entityManager实例保存在注册表中的某个位置,以便我可以随时访问它?这是一个好的做法吗

use Zend\View\Helper\AbstractHelper;
use Doctrine\ORM\EntityManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;


class IsAuthz extends AbstractHelper implements ServiceManagerAwareInterface 
{

    /*
     * @var Doctrine\ORM\EntityManager
    */
    protected $em;
    protected $sm;    

    public function __construct($e) {
        $app = $e->getParam('application');
        $em = $this->getEntityManager();        
    }


    public function __invoke()
    {     
        return $this;

    }



/**
     * @return Doctrine\ORM\EntityManager
     */
    public function getEntityManager() 
    {

        if (null === $this->em) {
            $this->em = $this->sm->getServiceLocator()->get('doctrine.entitymanager.orm_default');
        }
        return $this->em;
    }

    /**
     * 
     * @param \Doctrine\ORM\EntityManager $em
     */
    public function setEntityManager(EntityManager $em) 
    {
        $this->em = $em;
    }

    /**
     * Retrieve service manager instance
     *
     * @return ServiceManager
     */
    public function getServiceManager() 
    {
        return $this->sm->getServiceLocator();
    }

    /**
     * Set service manager instance
     *
     * @param ServiceManager $locator
     * @return void
     */
    public function setServiceManager(ServiceManager $serviceManager) 
    {
        $this->sm = $serviceManager;
    }



}
错误:

Fatal error: Call to a member function getServiceLocator() on a non-object in XXX/XXX/src/XXX/View/Helper/IsAuthz.php on line 41
正如“Daniel M”所说,最好使用该服务来保持数据逻辑的分离。但是有人仍然希望在视图助手中使用数据逻辑,他可以按如下方式操作。我已将上述代码更改如下

public function __construct($e, $sm) {
        $app = $e->getParam('application');
        $this->sm = $sm;
        $em = $this->getEntityManager();        
    }
然后我使用

    public function onBootstrap($e)
    {
      $serviceManager->get('viewhelpermanager')->setFactory('IsAuthz', function ($sm) use ($e) {
           return new \xxx\View\Helper\IsAuthz($e, $sm); 
        });
}

更好的方法是这样做。

错误表明您尚未实例化ServiceManager。也许这会解决您的问题?您能指导我如何在ViewHelper中实现这一点吗?如果您需要ViewHelper中的SM,您必须首先注入它。您可以通过将其分配给视图,然后将其分配给视图内的ViewHelper(
$this->helperName()->setServiceManager($sm);
一次),将其传递给视图。然而,我不认为视图助手应该执行数据(基本)逻辑。它们是为了提供可重用的代码片段来改变某些东西的外观。如果你想知道某人是否被授权,我宁愿作为控制器插件或在任何其他类中执行此操作,并将此信息传递给视图。要完成我的上述评论,视图可以获取此信息并呈现您想要呈现的任何内容,具体取决于用户是否经过身份验证。我会为此创建一个服务类并将其传递给视图。使用这种方法,您必须将它传递给每个需要它的视图,但是您需要一个。将数据逻辑与视图逻辑和b分开。解决所有servicemanager/entitymanager问题。