我尝试使用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',
)
),
答案 0 :(得分:2)
您正在尝试将服务创建为“可调用”类。 ZF2会将此服务视为没有依赖项的类(而不是使用工厂创建它)。
您应该更新您的服务配置,以便在'factories'
键下注册,并指向 factory 类名。
'service_manager' => [
'invokables' => [
'Application\\Service\\DbConnectorService'
=> 'Application\\Service\\DbConnectorService',
],
'factories' => [
'Application\\Service\\DataServiceInterface'
=> 'Application\\Factory\\DataServiceFactory',
],
],
如果DbConnectorService
还有工厂,则需要对其进行相同的更改。