6

を使用してコントローラー内のエンティティマネージャーにアクセスできます$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');

しかし、Zendframework 2 のプロジェクトの残りの部分でエンティティ マネージャーのシングルトン インスタンスにアクセスするにはどうすればよいでしょうか。

4

1 に答える 1

12

それを行う「正しい」方法は、ファクトリを使用してエンティティマネージャを必要なクラスに注入することです。ファクトリ以外のクラスは、実際には ServiceLocator を認識するべきではありません。したがって、モジュール構成は次のようになります。

 'controllers' => array(
     'factories' => array(
          'mycontroller' => 'My\Namespace\MyControllerFactory'
     )
 )

次に、ファクトリ クラスは次のようになります。

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class MyControllerFactory implements FactoryInterface
{

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $serviceLocator = $serviceLocator->getServiceLocator();

        $myController = new MyController;
        $myController->setEntityManager(
            $serviceLocator->get('doctrine.entitymanager.orm_default')
        );

        return $myController;
    }
}

エンティティ マネージャーを使用する必要がある他のクラスについても、同じパターンに従います。

エンティティ マネージャを使用するクラスが非常に多い場合は、ファクトリを必要とせずにエンティティ マネージャを注入する独自の Initalizer を SerivceManager に追加することを検討することをお勧めします。

于 2012-08-08T22:07:39.527 に答える