如何在CodeIgniter中有条件地加载配置文件?

时间:2009-06-25 11:03:41

标签: php codeigniter

我需要在CodeIgniter项目中创建类似于以下内容的东西: -

  • my_config.php
  • config_production.php
  • config_development.php

现在,my_config.php将自动加载。从那里,如果它是生产服务器,将加载config_production.php; <!1}将被加载。

我应该如何执行此操作?

我已尝试在config_development.php中执行以下操作:

my_config.php

由于<?php if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){ $this->config->load('config_production'); } else { $this->config->load('config_development'); } ?> 未初始化,因此无效。我怎样才能做到这一点?

7 个答案:

答案 0 :(得分:4)

两个选项:您可以尝试使用“$ CI”而不是“$ this”来引用对象:

$CI =& get_instance();    //do this only once in this file
$CI->config->load();  
$CI->whatever;

...这是从外部引用CI对象的正确方法。

或者其次,您可以在config.php文件中切换配置:

<?php
if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){
    $config['base_url'] = "http://dev.example.com/";
} else {
    $config['base_url'] = "http://prod.example.com/";

}
?>

...等。加载两个if / else块之间的所有差异。

答案 1 :(得分:3)

正如Eric提到的那样使用environments

  

您可以根据当前加载不同的配置文件   环境。

     

要创建特定于环境的配置文件,请创建或复制   中的配置文件   应用/配置/ {环境} / {FILENAME} .PHP

     

注意:CodeIgniter总是尝试加载配置文件   当前的环境首先。如果文件不存在,则全局   配置文件(即application / config /中的配置文件)已加载。这个   表示您没有义务放置所有配置文件   在环境文件夹中 - 只有每个更改的文件   环境。

为什么实施逻辑,当它已经存在? ;)

答案 2 :(得分:2)

这是旧的,已经有一个公认的答案,但我想出了一个我认为运作良好的解决方案。正如@Eric所提到的,最好的方法是使用环境变量的内置功能来确定配置逻辑。我采用这种方法的问题是,它需要维护大量冗余值,并且您经常需要一个可以在所有环境中运行的中央默认配置,并且只有特定于环境的值才会替换默认值。

您的文件夹结构应为:

/app/config/config.php
/app/config/development/config.php
/app/config/production/config.php

然后,在特定于环境的配置文件中,使用以下内容作为起点:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// Set the default values first, then we'll overwrite environmental-specific values
include(APPPATH . '/config/' . pathinfo(__FILE__, PATHINFO_BASENAME));

使用这个作为起点可以让你为database.php等做同样的事情 - 你需要一个环境特定版本的任何/ config /文件,而不用编写CI已经提供的你自己的环境加载逻辑

答案 3 :(得分:1)

我在我的情况下使用这个。对于index.php

switch ($_SERVER['SERVER_NAME']) {
case 'localhost':
    define('ENVIRONMENT', 'development');
    break;
case 'example.com':
    define('ENVIRONMENT', 'production');
    break;
default:
    define('ENVIRONMENT', 'production');
    break;
}

对于application / config.php中的base_url:

switch ($_SERVER['SERVER_NAME']) {
case 'localhost':
    $config['base_url'] = "http://localhost/my_app/";
    break;
case 'example.com':
    $config['base_url'] = "http://example.com/";
    break;
default:
    $config['base_url'] = "http://example.com/";
    break;
}

对于application / database.php中的数据库:

switch ($_SERVER['SERVER_NAME']) {
case 'localhost':
    $db['default']['username'] = 'root';
    $db['default']['password'] = '123456';
    break;
case 'example.com':
    $db['default']['username'] = 'user';
    $db['default']['password'] = 'pass';
    break;
default:
    $db['default']['username'] = 'user';
    $db['default']['password'] = 'pass';
    break;
}

答案 4 :(得分:0)

您何时需要初始化配置? - 一旦其他所有内容都已初始化但在控制器执行之前,您是否可以定义hook来加载正确的配置?

答案 5 :(得分:0)

我的工作方式如下: -

$ci = & get_instance();

if (gethostbyaddr ("127.0.0.1") == 'production.example.com') {
    //Load production configuration
    $ci->load->config('config_production');
} elseif(gethostbyaddr ("127.0.0.1") == 'staging.example.com') {
    //Load staging configuration
    $ci->load->config('config_staging');
} else {
    //Load development configuration
    $ci->load->config('config_development');
} 

答案 6 :(得分:0)

为什么不使用环境? - http://codeigniter.com/user_guide/general/environments.html

配置文件也只是数组。为什么不包括它并将其与现有阵列合并?甚至在index.php中更好:

if (gethostbyaddr ("127.0.0.1") == 'production.example.com')
{
    include(APPPATH.'config/config_production.php');
}
elseif (gethostbyaddr ("127.0.0.1") == 'staging.example.com')
{
    include(APPPATH.'config/config_staging.php');   
}
else
{
    include(APPPATH.'config/config_development.php');
}

foreach ($config AS $key => $item)
{
    $assign_to_config[$key] = $item;
}

但在我看来,最好的方法是使用环境。