Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在zf2中配置多个数据库_Php_Zend Framework2 - Fatal编程技术网

Php 在zf2中配置多个数据库

Php 在zf2中配置多个数据库,php,zend-framework2,Php,Zend Framework2,如何在Zend Framework 2中配置(和使用)多个数据库?目前,我的global.php中有以下内容: return array( 'db' => array( 'driver' => 'Pdo', 'dsn' => 'mysql:dbname=my_db;host=localhost', 'driver_options' => array( PD

如何在Zend Framework 2中配置(和使用)多个数据库?目前,我的global.php中有以下内容:

return array(
    'db' => array(
        'driver'         => 'Pdo',
        'dsn'            => 'mysql:dbname=my_db;host=localhost',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
        'username' => 'user',
        'password' => '******',
    ),
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
        ),
    ),
);

但是我没有看到添加第二个键的方法。

如果您查看Zend\Db\Adapter\AdapterServiceFactory,您将看到适配器配置只指向一个键
'Db'
。这意味着它构建的适配器将始终使用此(唯一)配置密钥

我建议您创建自己的工厂,如下所示:

namespace Your\Namespace;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Db\Adapter\Adapter;

class MyAdapterFactory implements FactoryInterface
{

  protected $configKey;

  public function __construct($key)
  {
      $this->configKey = $key;
  }

  public function createService(ServiceLocatorInterface $serviceLocator)
  {
      $config = $serviceLocator->get('Config');
      return new Adapter($config[$this->configKey]);
  }
}
在主模块(或任何其他模块)中,将以下内容添加到module.php文件中,以向Zend Service Manager声明适配器工厂:

use Your\Namespace\MyAdapterFactory;
use Zend\ModuleManager\Feature\ServiceProviderInterface;

class Module implements ServiceProviderInterface{

//Previous code

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'myadapter1'        => new MyAdapterFactory('dbconfigkey1'),
            'myadapter2'        => new MyAdapterFactory('dbconfigkey2'),
            ),
       );

}

//...
$adapter1=$serviceManager->get('myadapter1');
$adapter2=$serviceManager->get('myadapter2');
全局配置现在应该如下所示:

return array(
'dbconfigkey1' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=my_db;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
    'username' => 'user',
    'password' => '******',
),

'dbconfigkey2' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=my_db2;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
    'username' => 'user',
    'password' => '******',
),

);
要使用适配器,您需要使用服务管理器调用它们:

use Your\Namespace\MyAdapterFactory;
use Zend\ModuleManager\Feature\ServiceProviderInterface;

class Module implements ServiceProviderInterface{

//Previous code

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'myadapter1'        => new MyAdapterFactory('dbconfigkey1'),
            'myadapter2'        => new MyAdapterFactory('dbconfigkey2'),
            ),
       );

}

//...
$adapter1=$serviceManager->get('myadapter1');
$adapter2=$serviceManager->get('myadapter2');
从2.2版开始 抽象服务工厂现在是zf2 Zend\Db模块的一部分。可以在“适配器”子键下添加多个配置键:

'db'=> array(
    'adapters'=>array(
        'adapter' => array(
            'driver'         => 'Pdo',
            'dsn'            => 'mysql:dbname=test;host=localhost',
            'username' => 'readCredential',
            'password' => '****'
        ),
        'adapter2' => array(
            'driver'         => 'Pdo',
            'dsn'            => 'mysql:dbname=test;host=localhost',
            'username' => 'rwCredential',
            'password' => '****'
        ),
    )
),
但是,AbstractServiceFactory需要“手动”添加,因为默认情况下并非如此:

'service_manager' => array(
    'abstract_factories' => array(
            'Zend\Db\Adapter\AdapterAbstractServiceFactory',
    )
),
如前所述,可以访问适配器:

$adapter1=$serviceManager->get('adapter');
$adapter2=$serviceManager->get('adapter2');

从性能角度来看,第二种方法更好:将实例化一个对象(抽象工厂),以(可能)创建不同的适配器。而在前面的方法中,每个配置创建一个对象。

我发现对

Zend Framework 2.2附带了抽象工厂
Zend\Db\Adapter\Adapter\AdapterAstractServiceFactory
,允许我们配置多个命名的Db适配器实例。这是一步一步完成的:

  • 在“服务管理器”键下的“抽象工厂”类型处注册
    Zend\Db\Adapter\Adapter\AdapterAstractServiceFactory

    //config/autoload/global.php //.... config/autoload/global.php的一部分 “服务管理器”=>数组( “抽象工厂”=>数组( “Zend\Db\Adapter\AdapterAstractServiceFactory”, ), ),

  • config/autoload/global.php的'db'键下配置'adapters'子键

  • //config/autoload/global.php //.... config/autoload/global.php的一部分

    'db' => array(
        'adapters' => array(
    
            'db1' => array(
               'driver'         => 'Pdo',
               'dsn'             => 'mysql:dbname=zf2_staging;host=localhost',
               'driver_options'  => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ),
            ),
    
            'db2' => array(
               'driver'         => 'Pdo',
               'dsn'             => 'mysql:dbname=zf2_test;host=localhost',
               'driver_options'  => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ),
            ),
        ),
    ),
    
    return array(
        'db' => array(
            //this is for primary adapter....
            'driver'         => 'Pdo',
            'dsn'             => 'mysql:dbname=zf21_learn;host=localhost',
            'driver_options'  => array(
                 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
             ),
    
            //other adapter when it needed...
            'adapters' => array(
    
                'db1' => array(
                   'driver'         => 'Pdo',
                   'dsn'             => 'mysql:dbname=zf2_staging;host=localhost',
                   'driver_options'  => array(
                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                    ),
                ),
                'db2' => array(
                   'driver'         => 'Pdo',
                   'dsn'             => 'mysql:dbname=zf2_test;host=localhost',
                   'driver_options'  => array(
                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                    ),
                ),
    
            ),
        ),
        'service_manager' => array(
            // for primary db adapter that called
            // by $sm->get('Zend\Db\Adapter\Adapter')
            'factories' => array(
                'Zend\Db\Adapter\Adapter'
                        => 'Zend\Db\Adapter\AdapterServiceFactory',
            ),
            // to allow other adapter to be called by
            // $sm->get('db1') or $sm->get('db2') based on the adapters config.
            'abstract_factories' => array(
                'Zend\Db\Adapter\AdapterAbstractServiceFactory',
            ),
        ),
    );
    
  • config/autoload/local.php的'db'键下配置'adapters'子键
  • //config/autoload/local.php

    return array(
        'db' => array(
            'adapters' => array(
                'db1' => array(
                    'username' => 'root',
                    'password' => '',
                ),
                'db2' => array(
                    'username' => 'other_user',
                    'password' => 'other_user_passwd',
                ),
            ),
        ),
    );
    
    return array(
        'db' => array(
            // for primary db adapter that called
            // by $sm->get('Zend\Db\Adapter\Adapter')
            'username' => 'root',
            'password' => '',
    
            // to allow other adapter to be called by
            // $sm->get('db1') or $sm->get('db2') based on the adapters config.
            'adapters' => array(
                'db1' => array(
                    'username' => 'root',
                    'password' => '',
                ),
                'db2' => array(
                    'username' => 'other_user',
                    'password' => 'other_user_passwd',
                ),
            ),
        ),
    );
    
  • 从ServiceManager使用“db1”或“db2”作为db适配器调用适配器

    $sm->get('db1')

    $sm->get('db2')

  • 如果需要将
    $sm->get('Zend\Db\Adapter\Adapter')
    作为主适配器,将'db1'和'db2'作为特定用途的其他适配器,则需要直接在Db下定义主适配器,因此
    config/autoload/global.php的配置如下所示:

    //config/autoload/global.php

    'db' => array(
        'adapters' => array(
    
            'db1' => array(
               'driver'         => 'Pdo',
               'dsn'             => 'mysql:dbname=zf2_staging;host=localhost',
               'driver_options'  => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ),
            ),
    
            'db2' => array(
               'driver'         => 'Pdo',
               'dsn'             => 'mysql:dbname=zf2_test;host=localhost',
               'driver_options'  => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ),
            ),
        ),
    ),
    
    return array(
        'db' => array(
            //this is for primary adapter....
            'driver'         => 'Pdo',
            'dsn'             => 'mysql:dbname=zf21_learn;host=localhost',
            'driver_options'  => array(
                 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
             ),
    
            //other adapter when it needed...
            'adapters' => array(
    
                'db1' => array(
                   'driver'         => 'Pdo',
                   'dsn'             => 'mysql:dbname=zf2_staging;host=localhost',
                   'driver_options'  => array(
                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                    ),
                ),
                'db2' => array(
                   'driver'         => 'Pdo',
                   'dsn'             => 'mysql:dbname=zf2_test;host=localhost',
                   'driver_options'  => array(
                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                    ),
                ),
    
            ),
        ),
        'service_manager' => array(
            // for primary db adapter that called
            // by $sm->get('Zend\Db\Adapter\Adapter')
            'factories' => array(
                'Zend\Db\Adapter\Adapter'
                        => 'Zend\Db\Adapter\AdapterServiceFactory',
            ),
            // to allow other adapter to be called by
            // $sm->get('db1') or $sm->get('db2') based on the adapters config.
            'abstract_factories' => array(
                'Zend\Db\Adapter\AdapterAbstractServiceFactory',
            ),
        ),
    );
    
    config/autoload/global.local.php
    的配置也应如下所示:

    //config/autoload/local.php

    return array(
        'db' => array(
            'adapters' => array(
                'db1' => array(
                    'username' => 'root',
                    'password' => '',
                ),
                'db2' => array(
                    'username' => 'other_user',
                    'password' => 'other_user_passwd',
                ),
            ),
        ),
    );
    
    return array(
        'db' => array(
            // for primary db adapter that called
            // by $sm->get('Zend\Db\Adapter\Adapter')
            'username' => 'root',
            'password' => '',
    
            // to allow other adapter to be called by
            // $sm->get('db1') or $sm->get('db2') based on the adapters config.
            'adapters' => array(
                'db1' => array(
                    'username' => 'root',
                    'password' => '',
                ),
                'db2' => array(
                    'username' => 'other_user',
                    'password' => 'other_user_passwd',
                ),
            ),
        ),
    );
    

    这种策略在2.1中有没有改变?在快速浏览Zend\Db\Adapter\AdapterServiceFactory之后,我不这么认为。