2009-06-25 78 views
1

我需要創建一個類似於我笨項目中下面的內容: - 現在如何有條件地加載CodeIgniter中的配置文件?

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

my_config.php會被自動加載。從那裏,如果它是生產服務器,將會加載config_production.php;否則將加載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'); 
} 
?> 

它不是$this->config工作未初始化。我怎樣才能做到這一點?

回答

4

兩種選擇:你可以嘗試用「$ CI」而不是「$這個」引用對象:

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

...這是從外部引用CI對象的正確方法。

還是其次,你可以從你的config.php文件中切換CONFIGS:

<?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塊之間的所有差異。

+0

+1。我做了這樣的事情,它工作。 – Sabya 2009-06-25 13:17:09

0

你什麼時候需要配置初始化? - 一旦一切都已經初始化,但在控制器執行之前,你能否定義一個hook加載正確的配置?

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'); 
} 
+1

剛剛出來的「更好的做法」,你應該可以這樣做: $ host = gethostbyaddr(「127.0.0.1」); if($ host =='production.example.com'){ 這樣你只需要調用gethostbyaddr一次。 – cwallenpoole 2009-06-25 13:26:26

0

我在的情況下使用。對於index.php文件

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

對於BASE_URL應用/ config.php文件:

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; 
} 

對於數據庫應用程序/ 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; 
} 
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; 
} 

但是最好的方法是在我看來使用環境。

3

正如Eric所述,使用environments

根據當前的 環境,您可能會加載不同的配置文件。

要創建一個特定的環境配置文件,創建或複製 在 的application/config/{環境}/{FILENAME}配置文件.PHP

注:笨總是試圖加載配置文件 當前環境第一。如果該文件不存在,則加載全局配置文件 (即application/config /中的文件)。此 表示您沒有義務將所有配置文件 置於環境文件夾中 - 僅限於每個環境變更的文件。

爲什麼在邏輯已經存在的時候執行邏輯? ;)

1

這是舊的,已經有一個公認的答案,但我想出了一個解決方案,我認爲很好。正如@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已經提供的環境加載邏輯。

相關問題