首页 文章

ZF3多个数据库适配器

提问于
浏览
2

在ZF2中,可以在_2361704中配置多个这样的适配器:

'db' => array(
    'adapters'=>array(
        'db1' => array(
            'driver' => 'Pdo',
            'dsn' => 'mysql:dbname=zf2;host=localhost',
            'driver_options' => array(
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
            ),
            'username' => 'zf2',
            'password' => 'zf2test',
        ),
        'db2' => array(
            'driver' => 'Pdo',
            'dsn' => 'mysql:dbname=zf1;host=localhost',
            'driver_options' => array(
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
            ),
            'username' => 'zf1',
            'password' => 'zf1test',
        ),
    )

),

在控制器工厂中,我可以通过ServiceManager获取它们:

class AlbumControllerFactory implements FactoryInterface
{

public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $albumTable = $serviceLocator->getServiceLocator()->get('Album\Model\AlbumTable');
        $db1Adapter = $serviceLocator->getServiceLocator()->get('db1');
        $db2Adapter = $serviceLocator->getServiceLocator()->get('db2');

        return new AlbumController($albumTable, $db1Adapter, $db2Adapter);
    }
}

现在我试图在Zend Framework 3中做同样的事情 - 但是这个嵌套的数组配置不起作用:

Fatal error: Uncaught exception 'Zend\Db\Adapter\Exception\InvalidArgumentException' with message 'createDriver expects a "driver" key to be present inside the parameters' in /var/www/USER/teckert/zf3/vendor/zendframework/zend-db/src/Adapter/Adapter.php:262

我认为在ZF 2中,当dbAdapter尝试创建驱动程序时,已经处理了 adapters 键 - 但这不是在ZF 3中发生的 .

任何提示都受到热烈欢迎......

zend-db with the adapters section的手册对我来说不够清楚

EDIT

根据this doc我已将以下代码段添加到全局配置文件中:

'service_manager' => [
    'abstract_factories' => [
        \Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
    ],
],

在我的 AlbumTableFactory 尝试使用 $container->get('db1') 获取dbAdapter时出现此错误:

Unable to resolve service "db1 to a factory; are you certain you provided it during configuration?

2 回答

  • 1

    确保已将 Zend\Db\Adapter\AdapterAbstractServiceFactory 添加到ServiceManager配置的 abstract_factories 数组中 . 此抽象工厂负责实例化各个数据库适配器 . 另外,检查 Album\Model\AlbumTable 工厂是否使用正确的名称检索数据库适配器 .

  • 1

    好吧,我终于解决了这个问题 .

    正如@Pieter所提到的,我在 config.php 中需要以下数组内容:

    'service_manager' => [
        'abstract_factories' => [
            \Zend\Db\Adapter\AdapterAbstractServiceFactory::class,
        ],
    ],
    

    另外,我不得不改变我的课程和依赖工厂彼此交谈的过程 .

    调用

    • AlbumControllerFactory 并获取依赖 AlbumTable 服务( $container->get(AlbumTable::class); )然后触发 AlbumTableFactory

    • AlbumTableFactory 然后正在为 AlbumTable 准备 $tableGateway = $container->get(AlbumTableGateway::class); 的构造函数注入

    • 现在我将 AlbumTableFactoryAlbumTableGatewayFactory 的逻辑合并为一个 AbstractFactoryInterface (我完全删除了AlbumTableGatewayFactory)

    // AlbumTableFactory implements AbstractFactoryInterface
    
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $dbAdapter = $container->get('db1');
        $resultSetPrototype = new ResultSet();
        $resultSetPrototype->setArrayObjectPrototype(new Album());
    
        $tableGateway = new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
    
        return new AlbumTable($tableGateway);
    }
    

相关问题