如何在服务层注入依赖?

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]]

并且通过服务定位器,您必须调用别名。