如何在服务层注入依赖?
How do I inject dependency in service layer?
我是 Zend Framework 2 的新手,也是依赖注入、服务层和工厂概念的新手。
我目前正在尝试创建一个需要服务定位器的服务层。一旦成功,我需要将此服务传递给控制器,但我无法让它正常工作。
我总是在 PageControllerFactory.php
中收到此错误消息
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for `Template\Service\PageService`
任何人都可以帮助指导我正确的方向,了解为什么我无法为 Template\Service\PageService
获取或创建实例吗?
我在想也许我没有包括它 module.config.php
但那不是 service_manager
factories
应该做的吗?
module.config.php
'controllers' => array(
'factories' => array(
'Template\Controller\Factory\PageControllerFactory',
),
),
'service_manager' => array(
...
'factories' => array(
'Template\Service\Factory\PageServiceFactory',
'Template\Service\Factory\SharedServiceFactory',
),
...
),
这是我为 SharedService 注入服务定位器的工厂
SharedServiceFactory.php
namespace Template\Service\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Template\Service\SharedService;
class SharedServiceFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
return new SharedService($serviceLocator->getServiceLocator());
}
}
然后我使用 __construct()
检索服务定位器。
SharedService.php
namespace Template\Service;
use Zend\ServiceManager\ServiceLocatorInterface;
use Template\Service\SharedServiceInterface;
class SharedService implements SharedServiceInterface
{
protected $serviceLocator;
...
public function __construct(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
...
代码在 PageControllerFactory.php 中中断。我假设 $parentService->get('Template\Service\PageService')
无法在此处检索 Template\Service\PageService
。这就是它抛出错误的原因。
PageControllerFactory.php
namespace Template\Controller\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Template\Controller\PageController;
class PageControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$parentService = $serviceLocator->getServiceLocator();
$pageService = $parentService->get('Template\Service\PageService');
$sharedService = $parentService->get('Template\Service\SharedService');
return new PageController($pageService, $sharedService);
}
}
PageController.php
namespace Template\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Template\Service\PageServiceInterface;
use Template\Service\SharedServiceInterface;
class PageController extends AbstractActionController
{
protected $pageService;
protected $sharedService;
public function __construct(
PageServiceInterface $pageService,
SharedServiceInterface $sharedService
) {
$this->pageService = $pageService;
}
...
而不是这个:
'service_manager' => array(
...
'factories' => array(
'Template\Service\Factory\PageServiceFactory',
'Template\Service\Factory\SharedServiceFactory',
),
...
),
声明:
'service_manager' => array(
...
'factories' => array(
'Template\Service\PageService' => 'Template\Service\Factory\PageServiceFactory',
'Template\Service\SharedService' => 'Template\Service\Factory\SharedServiceFactory',
),
...
),
config 中的工厂尚未按此格式声明:
[别名 => [工厂的 FQCN]]
并且通过服务定位器,您必须调用别名。
我是 Zend Framework 2 的新手,也是依赖注入、服务层和工厂概念的新手。
我目前正在尝试创建一个需要服务定位器的服务层。一旦成功,我需要将此服务传递给控制器,但我无法让它正常工作。 我总是在 PageControllerFactory.php
中收到此错误消息Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for `Template\Service\PageService`
任何人都可以帮助指导我正确的方向,了解为什么我无法为 Template\Service\PageService
获取或创建实例吗?
我在想也许我没有包括它 module.config.php
但那不是 service_manager
factories
应该做的吗?
module.config.php
'controllers' => array(
'factories' => array(
'Template\Controller\Factory\PageControllerFactory',
),
),
'service_manager' => array(
...
'factories' => array(
'Template\Service\Factory\PageServiceFactory',
'Template\Service\Factory\SharedServiceFactory',
),
...
),
这是我为 SharedService 注入服务定位器的工厂
SharedServiceFactory.php
namespace Template\Service\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Template\Service\SharedService;
class SharedServiceFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
return new SharedService($serviceLocator->getServiceLocator());
}
}
然后我使用 __construct()
检索服务定位器。
SharedService.php
namespace Template\Service;
use Zend\ServiceManager\ServiceLocatorInterface;
use Template\Service\SharedServiceInterface;
class SharedService implements SharedServiceInterface
{
protected $serviceLocator;
...
public function __construct(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
...
代码在 PageControllerFactory.php 中中断。我假设 $parentService->get('Template\Service\PageService')
无法在此处检索 Template\Service\PageService
。这就是它抛出错误的原因。
PageControllerFactory.php
namespace Template\Controller\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Template\Controller\PageController;
class PageControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$parentService = $serviceLocator->getServiceLocator();
$pageService = $parentService->get('Template\Service\PageService');
$sharedService = $parentService->get('Template\Service\SharedService');
return new PageController($pageService, $sharedService);
}
}
PageController.php
namespace Template\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Template\Service\PageServiceInterface;
use Template\Service\SharedServiceInterface;
class PageController extends AbstractActionController
{
protected $pageService;
protected $sharedService;
public function __construct(
PageServiceInterface $pageService,
SharedServiceInterface $sharedService
) {
$this->pageService = $pageService;
}
...
而不是这个:
'service_manager' => array(
...
'factories' => array(
'Template\Service\Factory\PageServiceFactory',
'Template\Service\Factory\SharedServiceFactory',
),
...
),
声明:
'service_manager' => array(
...
'factories' => array(
'Template\Service\PageService' => 'Template\Service\Factory\PageServiceFactory',
'Template\Service\SharedService' => 'Template\Service\Factory\SharedServiceFactory',
),
...
),
config 中的工厂尚未按此格式声明: [别名 => [工厂的 FQCN]]
并且通过服务定位器,您必须调用别名。