2011-03-14 9 views
2

저는 Doctrine 2를 활용하는 Zend Framework 프로젝트를 작업 중입니다. Symfony의 DI 컨테이너를 프로젝트와 함께 사용하려고하는데 문제가 있습니다. 두 개의 인스턴스를 주입해야하는 "Foo"클래스가 있다고 가정합니다. Symfony DI 컨테이너를 설치하면 의존성을 주입 한 새로운 "Foo"를 가져올 수 있습니다. 큰! 그러나 이제 "푸"를 교리 실체로 만들고 싶다면 어떻게해야할까요? DI 컨테이너에서 새 컨테이너를 가져 와서 엔티티를 유지할 수 있기 때문에 모두 엔터티를 DB에 삽입하면됩니다. 그러나 DB Doctrine에서 엔터티를 쿼리하면 "Foo"인스턴스가 인스턴스화되고 적절한 종속성이 주입되지 않습니다. 엔티티가 적절한 의존성을 갖도록 내 DI 컨테이너를 사용하도록 Doctrine을 얻으려면 어떻게해야합니까? 나는 Doctrine이 내 엔티티에 의존성을 주입하는 데 사용할 수있는 "postLoad"훅을 제공하지만 DI 컨테이너의 목적과 이점을 무력화시키는 그런 종류의 것을 제공합니다.Symfony DI 컨테이너가있는 Doctrine 2

답변

0

그것 조금 까다로운하지만 수행 할 수 있습니다 newable와 주 사이의 차이에 대한이 다음 블로그 게시물을 참조하십시오. 이미 존재하는 객체를 컨테이너 빌더 인스턴스에 전달하고 디 컨테이너가이를 위해 (예를 들어, 인터페이스에 기반한 의존성 삽입)하도록 허용하는 심포니 디 컨테이너에 대한 패치가 존재합니다. 패치는 github : https://github.com/lstrojny/symfony에있는이 저장소에 구현되었지만 symfony 마스터 저장소에 업스트림으로 만들지 않았습니다.

는이처럼 사용

$user = new User(); 
$container->configure('someId', $user); 

는 그런 다음 Doctrine's 개의 EventManager와 포스트로드 이벤트 핸들러 (: http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html 자세한 내용은 여기를 참조)를 등록 할 수 있습니다. 이 이벤트 핸들러에서 앞서 언급 한 메소드를 통해로드 된 엔티티를 구성합니다. 이것은 명백하지만이 경우에는 생성자 주입을 사용할 수 없습니다.

이 설정은 약간 까다 롭습니다. 특히 심포니 디 컨테이너가 인터페이스 기반 종속성을 주입 할 수있는 능력과 함께 특히 강력 할 수 있습니다.

관련 문제