我实际上是 ZF2 的初学者,我设法在同一个应用程序上使用多个 BDD 并且它可以工作。(我说的是:在 zf2 中配置多个数据库)。
不过,我有一个小问题......
可以在 global.php 中声明我的自定义工厂吗?(在 service_manager 中)。还是我需要在每个模块中声明它?(在 module.php 中)
将它声明到 global.php 中实际上是可行的,但我想知道它是否没有破坏框架的精神或其他什么......
谢谢你的时间 !
图努
我实际上是 ZF2 的初学者,我设法在同一个应用程序上使用多个 BDD 并且它可以工作。(我说的是:在 zf2 中配置多个数据库)。
不过,我有一个小问题......
可以在 global.php 中声明我的自定义工厂吗?(在 service_manager 中)。还是我需要在每个模块中声明它?(在 module.php 中)
将它声明到 global.php 中实际上是可行的,但我想知道它是否没有破坏框架的精神或其他什么......
谢谢你的时间 !
图努
将连接设置存储在本地配置中:
config/autoload/local.php
这是在您有多个具有不同数据库/连接凭据等的环境的情况下,例如,您可以提供暂存设置和实时设置,两者都使用单独的数据库。然后,您也可以通过这种方式在应用程序中使用多个连接。
没有什么可以阻止您在这里设置多个连接,并根据需要在数据库适配器等中使用它们。
本地.php
return array(
/**
* Database Connection One
*/
'db' => array(
'driver' => 'pdo',
'dsn' => 'mysql:dbname=dbnamehere;host=localhost',
'username' => 'root',
'password' => '',
),
/**
* Database Connection Two
*/
'db_two' => array(
'driver' => 'pdo',
'dsn' => 'mysql:dbname=anotherdb;host=localhost',
'username' => 'root',
'password' => '',
),
如果您正在使用版本控制(您应该这样做!),这还允许您从存储库中排除 .local 配置文件以避免在其中存储密码等,并允许更轻松地部署到多个环境。
您也可以设置多个适配器以使用不同的连接:
全局.php
return array(
/**
* Database Adapter(s)
*/
'service_manager' => array(
'factories' => array(
/**
* Adapter One - this factory will use the default 'db' connection
*/
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
/**
* Adapter Two - use the second connection
*/
'Application\Db\AdapterTwo' => function($sm) {
$config = $sm->get('Config');
return new Adapter($config['db_two']);
},
),
),
);
要一次连接多个数据库,请执行以下步骤:
步骤1:
创建 /module/MyModule/ 并添加到 application.config.ini 以访问。
第 2 步: 使用以下脚本在 /module/MyModule/ 目录中创建 Module.php
<?php
namespace MyModule;
use MyModule\MyAdapterFactory;
use Zend\ModuleManager\Feature\ServiceProviderInterface;
class Module implements ServiceProviderInterface{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__.'/Db/Adapter/',
),
),
);
}
public function getServiceConfig()
{
return array(
'factories' => array(
'adapter1' => new MyAdapterFactory('db_adapter1'),
'adapter2' => new MyAdapterFactory('db_adapter2'),
),
);
}
}
第 3 步:
使用以下脚本在路径中创建 MyAdapterFactory.php:/module/MyModule/src/MyModule/Db/Adapter/。
<?php
namespace MyModule;
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]);
}
}
?>
第4步:
在您的 getServiceConfig() 中添加以下脚本。
'YourModule\Model\YourTable' => function($sm) {
$tableGateway = $sm->get('YourTableGateway');
$table = new YourTable($tableGateway);
return $table;
},
'YourTableGateway' => function ($sm) {
$adapter1 = $sm->get('adapter1');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new YourModel());
return new TableGateway('tbl_name', $adapter1, null, $resultSetPrototype);
},
第 5 步:
将方法添加到您的控制器中以访问您的表,如下所示:
在课程开始时声明:
受保护的 $this->yourTable;
public function getYourTable()
{
if (!$this->yourTable) {
$sm = $this->getServiceLocator();
$this->yourTable = $sm->get('YourModule\Model\YourTable');
}
return $this->yourTable;
}
然后,您可以在控制器中使用此函数 (getYourTable()) 为 Select、Update、Insert 调用模型方法。