2017-04-12 59 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 

MyService大約需要3庫的依賴關係,即由MyServiceFactory自然提供。但是,由於某種原因,視圖幫助程序沒有正確地調用工廠或類似的東西,導致實例化不正確。

所以我的下一個想法是:也許這不是你如何注入服務的觀點。所以現在我問:

如何注入服務的意見本身?

編輯:請不要說「通過它從控制器」。

回答

2

viewhelpers從一個單獨的插件管理器HelperPluginManager中檢索,這同樣適用於由ControllerManager管理的控制器。 要從「根」服務管理器檢索服務,您必須在工廠中調用getServiceLocator(),就像在控制器工廠中一樣。

所以,你的代碼應該是:

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

return new MyServiceViewHelper($ms);