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

时间:2017-04-12 14:38:20

标签: zend-framework2

我有一个服务类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;。

1 个答案:

答案 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);