2011-09-05 2 views
1

엔티티 관리자를 서비스에 전달하려고하는데 올바른 방법을 찾지 못했습니다. 내가 컨트롤러에서 그들을 제거 완료 thats 왜 다른 방법을 찾는거야.엔티티 관리자를 서비스 계층 ZF Doctrine2에 전달

나는이 옵션을 생각하고 있었다 : 1. 레지스트리에 저장 한 다음 서비스 개체에서 액세스하려고했다. 거기에서 레지스트리에 액세스 할 수 있습니까? 2. em을 부트 스트랩의 서비스에 대한 기본 클래스의 정적 변수에 주입합니다.

올바른 방법은 무엇입니까?

감사

답변

1

컨트롤러에 EM에 대해 알리는 것은 아무 문제가 없습니다. 나는 보통 Doctrine을 부트 스트랩하기 위해 Zend_Application_Resource를 사용한다. 이 리소스는 EM을 사용할 수있는 "doctrine"이라는 부트 스트랩 리소스를 용이하게합니다. 추상 컨트롤러는 EM을 반환하는 em() 메서드를 구현합니다.

서비스 클래스를 인스턴스화 할 때 생성자는 생성자 시간에 $ this-> em()에 대한 호출을 통해 EM을 간단히 주입합니다.

몇 번이고 간단한 컨트롤러 동작이 특별한 서비스 클래스를 필요로하지 않지만 대신 수행 할 수 있습니다. $entity = $this->em()->getRepository('Some\Entity')->find(1); 이러한 경우에는 서비스 클래스를 통한 추가 리디렉션에 대한 이유가 표시되지 않습니다. .

2

나는 일반적으로 생성자에 인수로 EntityManager를 전달하는 것입니다 할 수있는 가장 좋은 방법을 생각한다.

단위 테스트를 할 때 엔티티 관리자를 쉽게 바꿀 수 있으며 1과 2의 방식과 달리 기본 클래스 또는 전역 데이터의 동작에 의존하지 않습니다 (레지스트리는 글로벌 변수)

컨트롤러에서 EM을 만지지 않도록 할 수있는 방법은 Symfony2 또는 ZF2에있는 것과 같은 종속성 주입 컨테이너를 사용하는 것입니다 (해당 구성 요소가 아직 안정적인지 확실하지 않음).

아마도 좀 더 간단한 접근법은 서비스 인스턴스를 가져 오기 위해 컨트롤러에서 사용하는 일종의 "서비스 위치 지정자"개체를 갖는 것입니다. 부트 스트랩에서 서비스를 사용하여 로케이터를 초기화하거나, 생성 한 팩토리 클래스를 사용하여 초기화 할 수 있습니다.

어쨌든 컨트롤러에 적어도 어떤 종류의 중간 개체가 필요할 것입니다. 개인적으로 나는 단지 EM 자체를 사용하는 것에 대한 문제를 정말로 보지 않는다. 단지 원하지 않는 다른 이유가 없다면 말이다.

관련 문제