Как условно загрузить файлы конфигурации в CodeIgniter? - PullRequest
2 голосов
/ 25 июня 2009

Мне нужно создать нечто похожее на следующее в моем проекте 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 не инициализирован. Как мне этого добиться?

Ответы [ 7 ]

4 голосов
/ 25 июня 2009

Два варианта: вы можете попробовать ссылаться на объект с помощью "$ 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.

3 голосов
/ 20 июля 2012

Как упоминал Эрик, используйте окружения .

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

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

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

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

2 голосов
/ 04 января 2013

Это старый и уже принятый ответ, но я нашел решение, которое, я думаю, работает хорошо. Как уже упоминалось @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 уже предоставляет .

1 голос
/ 15 декабря 2011

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

Для базы данных в 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;
}
0 голосов
/ 15 декабря 2011

Почему бы не использовать среду? - 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;
}

Но, на мой взгляд, лучший способ - использовать окружение.

0 голосов
/ 25 июня 2009

у меня получилось так: -

$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');
} 
0 голосов
/ 25 июня 2009

Когда вам нужен инициализированный конфиг? - не могли бы вы определить hook для загрузки правильной конфигурации после инициализации всего остального, но до выполнения контроллера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...