2012-01-06 13 views
1

私の目標は、setterを使用して祖先オブジェクトでDIを使用することです。そのため、祖先オブジェクトに共通のDIがあります。例えば他のモデルが継承した抽象モデルクラス、エンティティマネージャなどで事前設定された抽象モデルクラス。ZF2 AncesorオブジェクトのDependency Injection

これまでは、祖先を構成してDIで正常に作成した後、抽象クラスに変更してから、そのクラスの祖先DIの抽象的な(抽象的に設定されているかどうかにかかわらず)実行されません。このクラス

'di' => array(

'instance' => array(

     'Stuki\Model' => array(
      'parameters' => array(
       'em' => 'doctrine_em' 
      )   
     ), 

上記クラスおよびDIが動作するための

namespace Stuki;

use Doctrine\ORM\EntityManager; 

# abstract 
class Model { 
    protected $em; 

    public function setEm(EntityManager $em) { 
     $this->em = $em; 
    } 
} 

DI。しかし、私はそれが祖先で実行するので、

namespace Stuki\Model;

use Stuki\Model as StukiModel; 

class Authentication extends StukiModel { 
    public function getIdentity() { 
     return 'ħ'; #die('get identity'); 
    } 
} 

$auth = $e->getTarget()->getLocator()->get('Stuki\Model\Authentication'); 

最後の行は、$ AUTH =、DIを実行していないオブジェクト。

イントロスペクションを使用せずに祖先オブジェクトのDIを設定するにはどうすればよいですか?問題の核心は、あなたがInstanceManagerでEntityManagerを取るためにStuki \モデルを設定するが、Stuki \認証のためのディを求めている場合)

;私はミートアップを経由して答えたとき

+0

Doctrineエンティティの観点からは、エンティティはエンティティマネージャを認識できません。私はあなたがzf2の教義サポートのためにSpiffyDoctrineORMを使用していると思いますか? – Fge

答えて

0

申し訳ありませんが、私の仮定が間違っていました。

あなたはこの作品が、私は上位クラスでコンストラクタを定義する必要が本当に好きではないん...コンストラクタ注射に切り替えることができます。

class EntityManager { 

} 

# abstract 
abstract class Model { 
    protected $em; 

    public function __construct(EntityManager $em) { 
     $this->em = $em; 
    } 
} 

class Authentication extends Model { 
    public function getIdentity() { 
     return 'ħ'; #die('get identity'); 
    } 
} 

$di = new Zend\Di\Di(); 
$im = new Zend\Di\InstanceManager(); 
$di->setInstanceManager($im); 
$auth = $di->get('Authentication'); 
var_dump($auth); 

一つのことに注意することは、両方の私たちの例では、Diはまだ必要イントロスペクションを使用してインスタンシエータ、メソッド、メソッドのようなものを発見する。実行時のイントロスペクションを回避する唯一の方法は、プリコンパイルすることです。http://packages.zendframework.com/docs/latest/manual/en/zend.di.definition.html#zend.di.definition.compilerdefinition

関連する問題