2009-06-25 2 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» вместо «$ это»:

$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.

+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

Я использую это в моем случае. Для 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

As Eric упомянутый использование environments.

Вы можете загрузить различные файлы конфигурации в зависимости от текущей среды .

Чтобы создать файл конфигурации среды конкретной, создать или скопировать конфигурационный файл в приложении/конфигурация/{СРЕДЫ}/{FILENAME} .php

Примечания: CodeIgniter всегда пытается загрузить конфигурационные файлы текущая среда в первую очередь. Если файл не существует, загружается файл конфигурации (т. Е. Тот, который находится в приложении/config /). Это означает, что вы не обязаны размещать все ваши файлы конфигурации в папке с окружением - только файлы, которые меняются на .

Зачем внедрять логику, когда она уже существует? ;)

1

Это старый и уже принятый ответ, но я придумал решение, которое, я думаю, работает хорошо. Как отметил @Eric, лучший способ сделать это - использовать встроенную функциональность переменной окружения для определения логики конфигурации. Проблема, с которой я столкнулся, заключается в том, что она требует много избыточных значений, и вам часто требуется, чтобы центральная конфигурация по умолчанию запускалась для всех сред, и только значения, зависящие от значения envrion, заменяют значения по умолчанию.

Ваша структура папок должна быть:

/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/файл, для которого требуется версия для конкретной среды, без написания собственной логики логики envrionment-загрузки, которую предоставляет CI.

Смежные вопросы