2013-06-01 3 views
6

어디서나 서비스 로케이터를 얻기 : http://www.maltblue.com/tutorial/zend-framework-2-servicemanager이 문서에 따르면 ZF2

ServiceManager에 "이 오브젝트를 제공 짧은 간단한 응용 프로그램 레지스트리에"입니다. 따라서 응용 프로그램 내 어디에서나 액세스 할 수있는 싱글 톤이어야한다고 생각합니다. 그러나 ServiceManager의 경우에는 그렇지 않습니다.

응용 프로그램에서 서비스 로케이터 인스턴스를 가져올 수없는 이유는 무엇입니까?

+0

정확히 어디서 얻으시겠습니까? – Crisp

답변

1

여기 ServiceLocator가 원하는 곳에서 객체를 생성하는 간단한 방법은 ... 응용 프로그램의 부트 스트랩에서 ServiceLocator를 클래스의 정적 변수로 설정하는 매우 간단한 모듈입니다. 무언가를 만들 수있는 아이디어를 얻을 수 있습니다 귀하의 요구에 맞지 않는 경우 더 정교합니다. 여기에 모듈이 있습니다 ... https://github.com/fezfez/ServiceLocatorFactory

+0

하지만 ZF2 의미론이 깨지지 않습니까? – rafaame

+0

저는 ZF2 전문가는 아니지만 이것을 해결하기 위해 싱글 톤을 만드는 것이 이상하다고 생각합니다. 어디에서 초기화 하시겠습니까? – Herbert

5

ServiceManager는 기본적으로 컨테이너 역할을합니다. 컨테이너 내부에서 작성한 객체의 다양한 종속성을 충족시킨 다음 다른 객체가 사용하도록 반환합니다.

그래서 SM이 개체 위에 앉는 방식으로 개체 내부로 들어 가지 않습니다. 객체 내부에서 SM 인스턴스를 사용하고 있다면 (아마 다른 서비스에 액세스하는 경우) Inversion of Control이라는 원칙을 위반하게됩니다. 두 번째 예 의존성 ($user_data)으로

'factories'=>   
    array(
     'objB'=> function($sm) { 
      //this is the container where sm sites outside the object to satisfy its dependencies 
      $objB = new B($sm->get('user_data')); 
      return $objB; 
     } 
    ) 

개체에 주입 얻는다 :

다음

class A {  
    private $data; 
    public function __constructor($sm) { 
     $this->data = $sm->get('user_data'); // Service manager accessed inside the object 
    } 
} 

다른 방법 Module.php 내부 어딘가에

class B { 
    private $data; 
    public function __constructor($user_data) { 
      $this->data = $user_data;  //$user_data getting injected from sm container 
    } 
} 

은 두 가지이다.

관련 문제