如何使用原则 2 ZF2 在视图帮助程序中获取实体管理器



以下代码在抽象插件中工作正常,但我需要在视图助手中访问实体管理器。如何在视图帮助程序中获取实体管理器?

有没有办法将实体管理器实例保存在注册表中的某个位置,以便我可以随时随地访问它? 这是一个很好的做法吗?

use ZendViewHelperAbstractHelper;
use DoctrineORMEntityManager;
use ZendServiceManagerServiceManagerAwareInterface;
use ZendServiceManagerServiceManager;

class IsAuthz extends AbstractHelper implements ServiceManagerAwareInterface 
{
    /*
     * @var DoctrineORMEntityManager
    */
    protected $em;
    protected $sm;    
    public function __construct($e) {
        $app = $e->getParam('application');
        $em = $this->getEntityManager();        
    }

    public function __invoke()
    {     
        return $this;
    }

/**
     * @return DoctrineORMEntityManager
     */
    public function getEntityManager() 
    {
        if (null === $this->em) {
            $this->em = $this->sm->getServiceLocator()->get('doctrine.entitymanager.orm_default');
        }
        return $this->em;
    }
    /**
     * 
     * @param DoctrineORMEntityManager $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();        
    }

然后我从模块注入$sm对象.php使用

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

更好的方法是在 Zend Framework 2 中使用 service 来实现此目的。

相关内容

  • 没有找到相关文章

最新更新