К сожалению, Битрикс не предоставляет нам инструментов для конфигурирования проекта. В большинстве случаев разработчик решает проблему конфигурации проекта, помещая кучу констант в файл php_interface/init.php. Однако, в случае когда проект перерастает некоторую критическую массу, такой подход становится довольно неудобным.
Путей решения тут может быть множество (PEAR::Config для INI/XML/..., Symfony YAML для YAML). Однако, все эти решения относительно "тяжелы".
Я хочу предложить на Ваш суд небольшой класс для создания конфигурации на основе INI-файлов. Сразу скажу, что основная "соль" класса заключается в php-функции parse_ini_file.
/**
* Класс конфигуратора
*
* Класс предназначен для доступа к конфигурации проекта,
* хранящейся в формате INI
*/
class CSlConfig implements ArrayAccess
{
/**
* Ссылка на экземпляр класса
* @var object
*/
private static $_oInstance;
/**
* Путь к файлу конфигурации
* @var string
*/
private static $_sPathToConfig;
/**
* Конфигурация проекта
* @var array
*/
private $_aConfig = array();
/**
* Конструктор
*
* @throws INVALID_CONFIG_FILE
* @return CSlConfig
*/
private function __construct()
{
if( !empty( self::$_sPathToConfig ) && file_exists( self::$_sPathToConfig ) )
$this->_aConfig = parse_ini_file( self::$_sPathToConfig, true );
else
throw new Exception( 'INVALID_CONFIG_FILE' );
}
/**
* Получение экземпляра класса
*
* @return CSlConfig
*/
public static function GetInstance()
{
if( null === self::$_oInstance )
self::$_oInstance = new self();
return self::$_oInstance;
}
/**
* Инициализация конфигуратора
*
* @param string $sFileName Файл конфигурации
* @throws INVALID_CONFIG_FILE
* @return CSlConfig
*/
public static function SetUp( $sFileName )
{
if( empty( self::$_sPathToConfig ) )
self::$_sPathToConfig = $sFileName;
else
throw new Exception( 'CONFIG_FILE_CANT_BE_REDECLARED' );
}
/**
* Установка элемента массива
*
* @param integer $iOffset Смещение элемента
* @param mixed $mValue Значение элемента
* @throws CONFIG_CANT_BE_CHANGED
*/
public function OffsetSet( $iOffset, $mValue )
{
throw new Exception( 'CONFIG_CANT_BE_CHANGED' );
}
/**
* Проверка существования элемента массива
*
* @param integer $iOffset Смещение элемента
* @return bool
*/
public function OffsetExists( $iOffset )
{
return isset( $this->_aConfig[ $iOffset ] );
}
/**
* Удаление элемента массива
*
* @param integer $iOffset Смещение элемента
*/
public function OffsetUnset( $iOffset )
{
unset( $this->_aConfig[ $iOffset ] );
}
/**
* Получение элемента массива
*
* @param integer $iOffset Смещение элемента
* @return mixed
*/
public function OffsetGet( $iOffset )
{
return isset( $this->_aConfig[ $iOffset ] ) ?
$this->_aConfig[ $iOffset ] : null;
}
} // Конец класса CSlConfig
С помощью этого класса работа с INI-файлом
; This is a sample configuration file
; Comments start with ';', as in php.ini
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"
будет выглядеть следующим образом:
// Подключение класса
require_once( dirname( __FILE__ ) . '/config.php' );
// Настройка конфигуратора (это будет где-нибудь в php_interface/init.php)
CSlConfig::SetUp( 'config.ini' );
// Работа с конфигом (это будет в любом месте нашего кода)
$oConfig = CSlConfig::GetInstance();
var_dump( $oConfig['first_section'] );
var_dump( $oConfig['third_section']['phpversion'] );
Не когда не понимал почему в пхп пытаются придумать замену конфигурационным массивам их подобием в виде *.ini, хотя последний 1 в 1 является тем же самым массивом, только приходится дополнительно тужится чтоб его можно использовать как массив.
Вы хоть про запрещение на просмотр этого ini через htaccess упомините.
Вы хоть про запрещение на просмотр этого ini через htaccess упомините
Я надеюсь, что это и так всем понятно Хотя я бы рекомендовал, в обще не хранить настройки в DocumentRoot'е Вашего проекта. Например, можно использовать такую структуру папок (/var/www/you.project.com): config - здесь живут конфиги и т.д. htdocs - здесь живёт Битрегз, это DocumentRoot script - здесь живут скрипты (например кроновские)
Не пробывали замерять скорость парсинга большого INI-файла и просто подключения эквивалентного init.php с конфигурационным массивом и набором дефайнов внутри? или лучше время генерации страницы при использовании INI-файла VS. init.php в студию...
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».