CakePHP:根据配置值全局更改所有模型的数据库连接
CakePHP: Change database connection for all models globally based on Configure value
我有 3 个代码副本 - 在开发工作站、测试服务器和生产服务器上。
因此,我在名为 dev、test 和 production 的 database.php
文件中有 3 个单独的数据库配置。
我正在尝试找出一种根据写入 Configure
class 的值来切换连接的方法。我尝试完成此操作的方法是在 bootstrap.php
.
的最后一行要求一个名为 instance.php
的文件
require( APP . 'Config/instance.php' );
我的 instance.php
看起来像:
<?php
// Configure instance type
Configure::write( 'InstanceType', 'Development' );
//Configure::write( 'InstanceType', 'Test' );
//Configure::write( 'InstanceType', 'Production' );
在开发工作站上,第一行将取消注释。同样,在测试和生产中,第 2 行和第 3 行将保持未注释状态。
我需要的是一种方法(可能在 AppModel
中),它将在任何其他模型加载之前执行并设置正确的数据库配置。使用以下代码:
// Set DB Config
switch( Configure::read( 'InstanceType' ) ) {
case 'Development':
//default:
$this->useDbConfig = 'default';
break;
case 'Test':
$this->useDbConfig = 'test';
break;
case 'Production':
$this->useDbConfig = 'production';
break;
}
或(浓缩版)
$this->useDbConfig = Configure::read( 'InstanceType' ) == 'Development' ? 'default' : strtolower( Configure::read( 'InstanceType' ) );
我试图将其放入 AppModel
中的 __construct()
方法中,但是这开始抛出一堆关于 __construct
缺少参数的错误。
结果是:
- 所有模型都使用给定的数据库连接。
- 不要在每个模型中单独使用 DB 说明符。
- 无需在 3 个平台上维护
database.php
的 3 个不同副本。
我怎样才能完成这项工作?
谢谢。
你走在正确的轨道上。但是,代码不能放在 AppController.php
.
的构造中
相反,将其添加到 /app/Config/database.php
中的 class DATABASE_CONFIG
:
public function __construct() {
// Set DB Config
switch( Configure::read( 'InstanceType' ) ) {
case 'Development':
//default:
//do nothing, as $this->default holds the right config
break;
case 'Test':
$this->default = $this->test;
break;
case 'Production':
$this->default = $this->production;
break;
}
}
选项 2:Symlinks
另一种方法是创建 3 个不同版本的 database.php
文件,每个版本都包含每个服务器的正确数据库配置,您可以使用其余代码维护这些配置。
/app/Config/database-development.php
/app/Config/database-test.php
/app/Config/database-production.php
更新存储库时,这三个文件将复制到您的所有服务器。
然后您在每个指向正确配置文件的服务器上创建符号 link:
// Development Server
ln -s app/Config/database-development.php app/Config/database.php
// Test Server
ln -s app/Config/database-test.php app/Config/database.php
// Production Server
ln -s app/Config/database-production.php app/Config/database.php
确保在 .gitignore
中忽略此 symlink,这样它就不会被覆盖(默认的 CakePHP 行为)。
您仍然需要维护 3 个不同的数据库配置文件,但您可以在本地进行。你也可以去掉 Config/instance.php
.
我有 3 个代码副本 - 在开发工作站、测试服务器和生产服务器上。
因此,我在名为 dev、test 和 production 的 database.php
文件中有 3 个单独的数据库配置。
我正在尝试找出一种根据写入 Configure
class 的值来切换连接的方法。我尝试完成此操作的方法是在 bootstrap.php
.
instance.php
的文件
require( APP . 'Config/instance.php' );
我的 instance.php
看起来像:
<?php
// Configure instance type
Configure::write( 'InstanceType', 'Development' );
//Configure::write( 'InstanceType', 'Test' );
//Configure::write( 'InstanceType', 'Production' );
在开发工作站上,第一行将取消注释。同样,在测试和生产中,第 2 行和第 3 行将保持未注释状态。
我需要的是一种方法(可能在 AppModel
中),它将在任何其他模型加载之前执行并设置正确的数据库配置。使用以下代码:
// Set DB Config
switch( Configure::read( 'InstanceType' ) ) {
case 'Development':
//default:
$this->useDbConfig = 'default';
break;
case 'Test':
$this->useDbConfig = 'test';
break;
case 'Production':
$this->useDbConfig = 'production';
break;
}
或(浓缩版)
$this->useDbConfig = Configure::read( 'InstanceType' ) == 'Development' ? 'default' : strtolower( Configure::read( 'InstanceType' ) );
我试图将其放入 AppModel
中的 __construct()
方法中,但是这开始抛出一堆关于 __construct
缺少参数的错误。
结果是:
- 所有模型都使用给定的数据库连接。
- 不要在每个模型中单独使用 DB 说明符。
- 无需在 3 个平台上维护
database.php
的 3 个不同副本。
我怎样才能完成这项工作?
谢谢。
你走在正确的轨道上。但是,代码不能放在 AppController.php
.
相反,将其添加到 /app/Config/database.php
中的 class DATABASE_CONFIG
:
public function __construct() {
// Set DB Config
switch( Configure::read( 'InstanceType' ) ) {
case 'Development':
//default:
//do nothing, as $this->default holds the right config
break;
case 'Test':
$this->default = $this->test;
break;
case 'Production':
$this->default = $this->production;
break;
}
}
选项 2:Symlinks
另一种方法是创建 3 个不同版本的 database.php
文件,每个版本都包含每个服务器的正确数据库配置,您可以使用其余代码维护这些配置。
/app/Config/database-development.php
/app/Config/database-test.php
/app/Config/database-production.php
更新存储库时,这三个文件将复制到您的所有服务器。
然后您在每个指向正确配置文件的服务器上创建符号 link:
// Development Server
ln -s app/Config/database-development.php app/Config/database.php
// Test Server
ln -s app/Config/database-test.php app/Config/database.php
// Production Server
ln -s app/Config/database-production.php app/Config/database.php
确保在 .gitignore
中忽略此 symlink,这样它就不会被覆盖(默认的 CakePHP 行为)。
您仍然需要维护 3 个不同的数据库配置文件,但您可以在本地进行。你也可以去掉 Config/instance.php
.