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);
我有一项服务 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);