2012-09-20 66 views
3

以下代碼與AbstractPlugin正常工作,但我需要訪問視圖助手中的實體管理器。我如何才能在視圖助手中獲得實體經理?如何獲得實體經理在視圖幫助使用doctrine2 zf2

有沒有辦法在註冊表中的某處保存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 
+0

錯誤說你沒有實例化你的ServiceManager。也許這會解決你的問題? –

+0

你能指導我如何在viewhelper中做到這一點 – Developer

+1

如果你需要在你的ViewHelper中使用SM,你必須先注入它。你可以通過View來傳遞它,方法是將其分配給視圖,然後將其分配給視圖內的ViewHelper('$ this-> helperName() - > setServiceManager($ sm);'once)。但是,我認爲View Helpers不應該執行數據(基本)邏輯。它們的目的是提供可重用的片段來改變某些東西的外觀。如果您需要知道某人是否被授權,我寧願將其作爲控制器插件或任何其他課程中的內容,並將此信息傳遞給視圖。 –

回答

1

爲 「丹尼爾·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); 
     }); 
} 

更好的辦法是use service in zend framework 2爲此,注入$ SM對象從module.php。