Nasıl Şartlı CodeIgniter içinde Yapılandırma Files yük?

7 Cevap php

Ben benim CodeIgniter projesi kapsamında aşağıdaki benzer bir şey oluşturmanız gerekir: -

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

Şimdi, my_config.php özdevinimli edilecektir. Bu üretim sunucusu ise oradan, config_production.php yüklenir; else config_development.php yüklenecektir.

Bunu nasıl yürütülmesi hakkında gitmeli?

Ben aşağıdaki yapıyor çalıştı my_config.php ettik:

<?php
if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){
    $this->config->load('config_production');
} else {
    $this->config->load('config_development');
}
?>

Bu $this->config başlatılmadı gibi çalışmıyor. Bunu nasıl başarabiliriz?

7 Cevap

İki seçenek: yerine "$ bu" yorum "$ CI" ile nesne başvuran deneyebilirsiniz:

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

... Hangi dışarıdan CI nesnesine başvurmak için doğru yoldur.

Veya ikinci olarak, Eğer config.php dosyası içinde yapılandırmaları geçiş olabilir:

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

}
?>

Vb ... Iki if / else blokları arasındaki tüm farklılıkları yükleyin.

Eric kullanımı belirtildiği gibi environments.

You may load different configuration files depending on the current environment.

To create an environment-specific configuration file, create or copy a configuration file in application/config/{ENVIRONMENT}/{FILENAME}.php

Note: CodeIgniter always tries to load the configuration files for the current environment first. If the file does not exist, the global config file (i.e., the one in application/config/) is loaded. This means you are not obligated to place all of your configuration files in an environment folder − only the files that change per environment.

Zaten varken, neden, mantığı? ;)

Bu eski ve zaten kabul cevabı var ama ben iyi işler düşünüyorum bir çözüm ile geldi. Eric belirtildiği @ gibi, bunu yapmak için en iyi yolu yapılandırma mantığını belirlemek için ortam değişkeninin yerleşik işlevini kullanmaktır. Ben bu yaklaşım vardı bu sorun gereksiz değerlerinin çok maintianing gerektirir ve genellikle varsayılan yerine tüm ortamlarda ve sadece envrionment-belirli değerleri için çalıştırmak alır merkezi varsayılan yapılandırma isteyeceksiniz olmasıdır.

Klasör yapısı olmalıdır:

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

Sonra, çevreye özgü yapılandırma dosyaları, bir başlangıç ​​noktası olarak aşağıdaki kullanın:

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

Bir başlangıç ​​noktası olarak kullanarak vb, database.php için aynı şeyi yapalım - Eğer herhangi / config / dosya CI zaten sağlar kendi envrionment yükleme mantığını yazmadan için bir ortam belirli bir versiyonunu istiyorum.

Ne zaman geneli tarafından başlatılmak gerekiyor? - Denetleyici idam önce her şey başlatıldı ama olmuştu bir kere doğru yapılandırmayı yüklemek için bir hook tanımlamak değil mi?

Ben bu gibi çalışma var: -

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

Ben benim durumumda bu kullanın. 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 için:

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

Uygulama / database.php veritabanının için:

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

Neden ortamları kullanmak değil mi? - http://codeigniter.com/user_guide/general/environments.html

Ayrıca config dosyalarını sadece diziler. Neden sadece içerir ve varolan diziden ile birleştirmek değil? Ya da daha iyisi 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;
}

Ama en iyi yolu bence ortamları kullanıyor.