3

次のコードは AbstractPlugin で正常に動作していますが、ビュー ヘルパーでエンティティ マネージャーにアクセスする必要があります。ビューヘルパーでエンティティマネージャーを取得するにはどうすればよいですか?

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
4

1 に答える 1

1

"Daniel M" が言ったように、サービスを使用してデータ ロジックを分離しておくのが最善です。しかし、ビュー ヘルパーでデータ ロジックを使用したい場合は、次のように実行できます。問題の上記のコードを次のように変更しました。

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

次に、module.php から $sm オブジェクトを挿入します。

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

より良い方法は、この目的のために zend フレームワーク 2 でサービスを使用することです。

于 2012-09-24T14:25:33.317 に答える