2017-04-12 1 views
0

컨트롤러 작성자의 매개 변수로 컨트롤러에 전달하는 서비스 클래스 MyService이 있습니다. 말할 것도없이, 팩토리를 사용하여 컨트롤러를 인스턴스화하고 팩토리의 서비스 위치 지정자를 사용하여 MyService을 검색 한 다음이를 인스턴스화 된 컨트롤러로 전달합니다.ZF2 -보기에 서비스를 삽입하는 방법?

// factory 
$sl = $sl->getServiceLocator(); 
$ms = $sl->get(MyService::class); 

return new MyController($sm); 

이제보기에 해당 서비스가 필요합니다. 나는이 같은 (컨트롤러와 유사) 종속성으로 MyService 걸릴 것 뷰 도우미를 만드는 시도 :

// view helper factory 
$ms = $sl->get(MyService::class); 

return new MyServiceViewHelper($ms); 

그러나, 제대로 MyService를 인스턴스화하지 않습니다. 그것은 말하는 충돌이 :

Catchable fatal error: Argument 1 passed to MyService::__construct() must be an instance of MyRepository, none given, called in /my-path/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php 

MyServiceMyServiceFactory에 의해 자연적으로 제공되는 종속 약 3 저장소를 취합니다. 그러나 어떤 이유로 뷰 도우미가 제대로 호출하지 못하거나 잘못된 것을 인스턴스화 할 수 있습니다.

그래서 내 생각은 다음과 같습니다. 이것은보기에 서비스를 삽입하는 방법이 아닐 수도 있습니다. 이제 묻습니다.

뷰 자체에 서비스를 삽입하려면 어떻게해야합니까?

편집 : "컨트롤러에서 전달"이라고 말하지 마십시오.

답변

2

viewhelpers는 별도의 플러그인 관리자 HelperPluginManager에서 검색되며 ControllerManager에 의해 관리되는 컨트롤러에도 동일하게 적용됩니다. "루트"serviceManager에서 서비스를 검색하려면 컨트롤러 팩토리에서와 마찬가지로 공장에서 getServiceLocator()으로 전화해야합니다.

그래서 코드는 다음과 같아야합니다

// view helper factory 
$sl = $sl->getServiceLocator(); //This line will do the trick 
$ms = $sl->get(MyService::class); 

return new MyServiceViewHelper($ms);