Doctrine orm 如何使用doctrine2zf2在视图帮助器中获取实体管理器
以下代码在AbstractPlugin中运行良好,但我需要在view helper中访问实体管理器。如何在视图助手中获取实体管理器 是否有办法将entityManager实例保存在注册表中的某个位置,以便我可以随时访问它?这是一个好的做法吗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
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问题。