我需要在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');
}
?>
未初始化,因此无效。我怎样才能做到这一点?
答案 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;
}
但在我看来,最好的方法是使用环境。