Zend2依赖注入工厂服务

时间:2017-10-19 00:17:41

标签: php pdo dependency-injection zend-framework2

我尝试使用Zend2服务管理器实现依赖注入。我想将一个PDO实例注入Service(我没有使用Zend Db)。

我遵循这里的教程:https://framework.zend.com/manual/2.4/en/in-depth-guide/services-and-servicemanager.html

我让它为另一项服务工作,但是当注入PDO实例时我得到了这个错误:

  

可捕获的致命错误:传递给Application \ Service \ DataService :: __ construct()的参数1必须是Application \ Service \ DbConnectorService的实例,没有给出,在/ srv / www / shared-apps / approot / apps-中调用第1077行的dev / ktrist / SBSDash / vendor / zendframework / zendframework / library / Zend / ServiceManager / ServiceManager.php,在/ srv / www / shared-apps / approot / apps-dev / ktrist / SBSDash / module / Application /中定义第24行的src / Application / Service / DataService.php

从教程中看,这似乎与我在module.config中的invokeable相关。但我无法解决问题所在。

感谢任何建议。

这是我的代码:

的DataService:

class DataService {
protected $dbConnectorService;

public function __construct(DbConnectorService $dbConnectorService) {
    $this->dbConnectorService = $dbConnectorService;
}
......

DataServiceFactory:

namespace Application\Factory;

use Application\Service\DataService;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class DataServiceFactory implements FactoryInterface {

function createService(ServiceLocatorInterface $serviceLocator) {
    $realServiceLocator = $serviceLocator->getServiceLocator();
    $dbService = $realServiceLocator->get('Application\Service\DbConnectorService');

    return new DataService($dbService);
}

}

Module.Config:

'controllers' => array(
'factories' => array(
        'Application\Controller\Index' => 'Application\Factory\IndexControllerFactory',
        'Application\Service\DataService' => 'Application\Factory\DataServiceFactory',
    )
),
    'service_manager' => array(
    'invokables' => array(
        'Application\Service\DataServiceInterface' => 'Application\Service\DataService',
        'Application\Service\DbConnectorService' => 'Application\Service\DbConnectorService',
    )
),

1 个答案:

答案 0 :(得分:2)

您正在尝试将服务创建为“可调用”类。 ZF2会将此服务视为没有依赖项的类(而不是使用工厂创建它)。

您应该更新您的服务配置,以便在'factories'键下注册,并指向 factory 类名。

'service_manager' => [
    'invokables' => [
        'Application\\Service\\DbConnectorService'
            => 'Application\\Service\\DbConnectorService',
    ],
    'factories' => [
        'Application\\Service\\DataServiceInterface' 
            => 'Application\\Factory\\DataServiceFactory',
    ],
],

如果DbConnectorService还有工厂,则需要对其进行相同的更改。