如何动态(基于服务器环境)选择我的Kohana ORM连接到哪个数据库?

时间:2014-07-21 07:20:39

标签: php orm kohana kohana-3.2

这适用于Kohana v3.2

如何动态选择ORM模型连接的数据库?具体来说,我正在尝试更改ORM模型以在本地开发,登台和生产环境中使用数据库。

Kohana Guide告诉我可以通过在ORM模型上设置受保护属性来设置数据库连接,如下所示:

class Model_Customer extends ORM
{
    protected $_db_group = 'local_db';
    protected $_table_name = 'customer';

这在本地开发时效果很好,但是当我进入舞台然后制作时呢?我每次更改环境时都不必更改_db_group。我可以检查服务器变量以确定环境,但我还没有找到一种方法来动态设置db_group属性以匹配环境,因为我无法在类定义中执行任何逻辑。

我可能有更好的方法来解决这个问题,我希望有人能够提出建议。谢谢。

3 个答案:

答案 0 :(得分:1)

在我看来,请检查database.php配置文件中的连接。

return array
(
    'default' => array
    (
        'type'       => 'MySQL',
        'connection' => array(
            /**
             * The following options are available for MySQL:
             *
             * string   hostname     server hostname, or socket
             * string   database     database name
             * string   username     database username
             * string   password     database password
             * boolean  persistent   use persistent connections?
             * array    variables    system variables as "key => value" pairs
             *
             * Ports and sockets may be appended to the hostname.
             */
            'hostname'   => 'localhost',
            'database'   => (Kohana::$environment == Kohana::DEVELOPMENT) ? 'local_db' : 'kohana',
            'username'   => FALSE,
            'password'   => FALSE,
            'persistent' => FALSE,
        ),
        'table_prefix' => '',
        'charset'      => 'utf8',
        'caching'      => FALSE,
    ),
); 

答案 1 :(得分:0)

正如我在mobal's answer的评论中所说的那样,在使用相同的逻辑时,我会采取略微不同的方法。

您可以在documentation中看到可以有多个数据库配置。在这种情况下,它可能看起来像这样

return array(
    'default' => array( /* regular connection */ ),
    Kohana::DEVELOPMENT => array( /* connection for development */ )
);

现在问题是:在哪里应该使用逻辑来决定使用哪个连接?首先我认为ORM课程会是个好地方 - 但实际上我对此表示怀疑。模型不应该关注,使用哪种连接。

然而,Database::instance()看起来正确。这是确定将使用哪种配置的方法。所以在这里更改它将影响使用数据库的所有内容 - 所以这是完美的地方。

由于Kohana使用包装类,您可以创建文件APPPATH/classes/Database.php并在此处添加更改

class Database extends Kohana_Database {

    public static function instance($name = NULL, $config = NULL) {
        if ($name === NULL && Kohana::$environment == Kohana::DEVELOPMENT) {
            $name = Kohana::DEVELOPMENT;
        }
        return parent::instance($name, $config);
    }

}

现在,只要您尝试获取默认实例(如果未设置_db_group,则在ORM中就是这种情况)在开发环境中,开发配置将用于连接到您的数据库。

答案 2 :(得分:-1)

感谢大家的想法。

我的用例涉及使用数据库配置文件,该文件引用6个不同的数据库(2个数据库乘以3个环境)。

对于我的特定情况,这是我可以提供的最简单的解决方案,而不用担心可能会在应用程序的其他区域中污染数据库连接

伪代码:

public function __construct()
{
    if ($_SERVER['HTTP_HOST'] == 'staging.acme.com')
    {
        $this->_db_group = 'db1_stage';
    }
    else if ($_SERVER['KOHANA_ENV'] == 'development')
    {
        $this->_db_group = 'db1_local';
    }
    else
    {
        $this->_db_group = 'db1_production';
    }

    parent::__construct();
}

这在调用$_db_group之前设置parent::construct()属性,它使用我需要的DB初始化ORM的数据库连接。