CakePHP:根据配置值

时间:2016-02-11 05:30:50

标签: php database cakephp model cakephp-2.x

我的代码有3份 - 在开发工作站,测试服务器和生产服务器上。

因此,我在名为dev,test&的database.php文件中有3个单独的数据库配置。生产

我正试图找出一种基于写入Configure类的值来切换连接的方法。我试图实现这一目标的方法是在instance.php的最后一行要求一个名为bootstrap.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;
    }

OR(精简版)

$this->useDbConfig = Configure::read( 'InstanceType' ) == 'Development' ? 'default' : strtolower( Configure::read( 'InstanceType' ) );

我尝试将其放入__construct()内的AppModel方法中,但是开始向__construct抛出一堆关于缺少参数的错误。

结果是:

  1. 所有型号都使用给定的DB连接。
  2. 不要在每个模型中单独使用DB说明符。
  3. 无需在3个平台上维护3个database.php的不同副本。
  4. 我该如何做到这一点?

    谢谢。

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。但是,代码不能放在AppController.php的构造中。

相反,请将其添加到DATABASE_CONFIG中的课程/app/Config/database.php

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:符号链接

另一种方法是创建3个不同版本的database.php文件,每个版本为每个服务器保存正确的数据库配置,您可以使用其余代码进行维护。

/app/Config/database-development.php
/app/Config/database-test.php 
/app/Config/database-production.php 

更新存储库时,这三个文件将复制到所有服务器。

然后,在每个指向正确配置文件的服务器上创建符号链接:

// 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中忽略此符号链接,因此不会被覆盖(默认的CakePHP行为)。

您仍然需要维护3个不同的数据库配置文件,但是您可以在本地执行此操作。你也可以摆脱Config/instance.php