2009-06-25 7 views
1

: - 今CodeIgniter内のコンフィギュレーションファイルを条件付きでロードするには?私は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 =& get_instance(); //do this only once in this file 
$CI->config->load(); 
$CI->whatever; 

...外部からCIオブジェクトを参照するための正しい方法です:あなたは「$の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/"; 

} 
?> 

...など。 2つのif/elseブロックの間にすべての違いをロードします。

+0

+1。私はそれのようなことをして、それは働いた。 – Sabya

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

+0

+1。はい、もちろん。 – Sabya

0

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

なぜ環境を使用しています。アプリケーション/ database.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; 
} 

:アプリケーション/ config.phpの中BASE_URLのためのindex.php

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

については? - 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

エリックが述べたように、environmentsを使用してください。

現在の 環境に応じて、異なる設定ファイルを読み込むことができます。

作成、環境固有の設定ファイルを作成したり、

注.PHP アプリケーション/設定/ {ENVIRONMENT}/{FILENAME}で設定ファイルが をコピーするには:CodeIgniterにはいつもの設定ファイルをロードしようとします 現在の環境が最初です。ファイルが存在しない場合は、グローバルファイル (つまり、application/config /にある)がロードされます。この は、すべての設定ファイル を環境フォルダに配置する義務がないことを意味します。変更するファイルは、 環境に限られます。

ロジックが実装されているのはなぜですか? ;)

1

これは古く、すでに受け入れられている回答がありますが、私はうまくいくと思う解決策を思いつきました。 @Ericが述べたように、これを行う最良の方法は、環境変数の組み込み機能を使用して設定ロジックを決定することです。このアプローチで問題になったのは、多くの冗長な値を設定する必要があり、すべての環境で実行される中央のデフォルト設定が必要であり、環境固有の値だけがデフォルト値を置き換えることです。

あなたのフォルダ構造は次のようになりますようになる出発点としてこれを使用して

<?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)); 

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

次に、あなたの環境固有の設定ファイルでは、出発点として、以下を使用しますdatabase.phpなどと全く同じことを行います。 - CIがすでに提供している独自のenvrionment-loadingロジックを書かずに、環境固有のバージョンが必要な/ config /ファイル。