以下代码在抽象插件中工作正常,但我需要在视图助手中访问实体管理器。如何在视图帮助程序中获取实体管理器?
有没有办法将实体管理器实例保存在注册表中的某个位置,以便我可以随时随地访问它? 这是一个很好的做法吗?
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 来实现此目的。