我有一个服务类MyService
,我在控制器上使用它作为参数在控制器构造函数中传递。不用说,我使用工厂来实例化控制器,并使用工厂的服务定位器来检索MyService
,然后将其传递给实例化的控制器。
// 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
自然提供。但是,出于某种原因,视图助手没有正确地调用工厂或类似的东西,导致实例化不正确。
所以我的下一个想法是:也许这不是你如何向视图注入服务。所以现在我问:
如何为视图本身注入服务?
编辑:请不要说"从控制器传递#34;。
答案 0 :(得分:2)
从单独的插件管理器HelperPluginManager
检索viewhelper,这同样适用于由ControllerManager
管理的控制器。
从" root"中检索服务serviceManager您必须像在控制器工厂中那样在工厂中调用getServiceLocator()
。
所以你的代码应该是:
// view helper factory
$sl = $sl->getServiceLocator(); //This line will do the trick
$ms = $sl->get(MyService::class);
return new MyServiceViewHelper($ms);