Как ввести зависимость на уровне сервиса?

Я новичок в Zend Framework 2, и я новичок в концепции внедрения зависимостей, уровня обслуживания и фабрики.

В настоящее время я пытаюсь создать слой службы, который требует Service Locator. Как только это сработает, мне нужно передать этот сервис контроллеру, но я не могу заставить его работать.
Я всегда получаю это сообщение об ошибке в 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;
}
...

-1

Решение

Вместо этого :

'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',
),
...
),

Фабрики в конфиге не должны быть объявлены в этом формате:
[Alias ​​=> [FQCN фабрики]]

А через сервисный локатор надо вызывать псевдоним.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]