9

Zend Framework 2 アプリケーションで Doctrine 2 を使用しています。ZF2 を使用して、Doctrine によって返されるエンティティに依存関係を注入する方法はありますか? エンティティは、データベースから取得するときに Doctrine によって構築されます。私が知る限り、ZF2 に依存関係を注入するには、Service Locator を使用してエンティティをインスタンス化する必要があります。Doctrines のコードベースを変更せずにそれを Doctrine と統合する方法がわかりません。現時点で実行可能な唯一の解決策は、Doctrine から返された結果を受け取り、必要な依存関係を注入する小さなサービスを作成することです。よりエレガントなソリューションはありますか?

敬具クリスチャン

4

1 に答える 1

16

Doctrine EventManager、特にエンティティがデータベースからロードされるたびに EventManager によって起動される postLoadライフサイクル イベントを調べます。

すべてを ZF2 に接続するには、いくつかのことを行う必要があります。

まず、Doctrine-Flavored イベントリスナーを書きます:

<?php
class InjectStuffListener {
   private $sl;

   public function __construct($serviceLocator){
      $this->sl = $serviceLocator;
   }

   public function postLoad($eventArgs){
       $entity = $eventArgs->getEntity;
       $entity->setThingToBeInjected($this->sl->get('some.thing'));
   }
}

次に、いくつかの Module.php のような場所で (onBootstrap よりも適切な場所があるかもしれませんが、何でも):

<?php
public function onBootstrap(){
    $sm = $e->getApplication()->getServiceManager();
    $em = $sm->get('doctrine.entitymanager.orm_default');
    $dem = $em->getEventManager();
    $dem->addEventListener(array( \Doctrine\ORM\Events::postLoad ), new InjectStuffListener( $sm ) );

}
于 2012-11-11T22:23:25.270 に答える