2012-01-06 5 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'); 

마지막 줄, $의 인증 = 개체를 원한다.

내성을 사용하지 않고 조상 개체에 대한 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); 

한 가지주의 할은 모두 우리의 예에서, 디 여전히 필요 인트로 검사를 사용하여 인스턴스 생성자, 메소드 및 메소드 매개 변수와 같은 것을 발견합니다. 런타임시의 인트로 스펙 션을 피하는 유일한 방법은 http://packages.zendframework.com/docs/latest/manual/en/zend.di.definition.html#zend.di.definition.compilerdefinition을 프리 D 파일하는 것입니다.

관련 문제