ZF2 - 如何将服务注入视图?

ZF2 - How to inject a service to a view?

我有一项服务 class 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 自然提供。然而,出于某种原因,视图助手没有正确调用工厂或类似的东西,导致不正确的实例化。

所以我的下一个想法是:也许这不是向视图注入服务的方式。所以现在我问:

如何将服务注入视图本身?

编辑:请不要说"pass it from the controller"。

viewhelpers 是从单独的插件管理器 HelperPluginManager 中检索的,这同样适用于由 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);