【问题标题】:ZF3 multiple database adaptersZF3 多数据库适配器
【发布时间】:2016-07-22 12:12:38
【问题描述】:

在 ZF2 中,可以像这样在 module.config.php 中配置多个适配器:

'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 中 adapters 键在 dbAdapter 尝试创建驱动程序时已被处理 - 但在 ZF 3 中不会发生这种情况。

热烈欢迎任何提示...

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

编辑

根据this doc,我在全局配置文件中添加了以下sn-p:

'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?

【问题讨论】:

    标签: php zend-framework factory zf3


    【解决方案1】:

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

    【讨论】:

    • 别忘了还必须安装Zend\Db 模块。 Zend Framework 3 默认不包含它。
    【解决方案2】:

    好的,我终于解决了这个问题。

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

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

    此外,我必须更改我的类和依赖工厂相互通信的过程。

    1. 调用AlbumControllerFactory 并获取依赖的AlbumTable 服务($container->get(AlbumTable::class);),然后触发AlbumTableFactory
    2. AlbumTableFactory 然后正在为AlbumTable$tableGateway = $container->get(AlbumTableGateway::class); 准备构造函数注入
    3. 现在我将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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2018-09-11
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多