Сохранение сложной конфигурации в файл (PHP) - PullRequest
1 голос
/ 12 июля 2009

У меня довольно большое веб-приложение MVC PHP (пользовательское, без фреймворка), которое использует XML-файл размером в несколько сотен строк для конфигурации. Данные конфигурации имеют довольно сложную структуру, которая очень элегантно представлена ​​в XML, но не так легко читается или записывается с использованием DOM. Все чтение и запись данных конфигурации проходит через класс Config, который имеет методы доступа для каждого типа данных конфигурации. Поскольку каждый узел XML отличается, большинство методов используют свой собственный код. Этот класс в настоящее время составляет около 2000 строк, и мне это не нравится. База данных недоступна.

Мне пришло в голову, что, возможно, лучшим способом сохранить данные конфигурации было бы создание некоторых классов конфигурации и использование сериализации объектов в файл.

Каковы некоторые рекомендации по обработке сложных данных конфигурации?

Ответы [ 4 ]

2 голосов
/ 12 июля 2009

INI-файлы - это способ, которым я использую для хранения конфигурации в Zend Framework, посмотрите пример конфигурации:

http://www.framework.zend.com/manual/en/zend.config.adapters.ini.html

; Production site configuration data
[production]
webhost                  = www.example.com
database.adapter         = pdo_mysql
database.params.host     = db.example.com
database.params.username = dbuser
database.params.password = secret
database.params.dbname   = dbname

; Staging site configuration data inherits from production and
; overrides values as necessary
[staging : production]
database.params.host     = dev.example.com
database.params.username = devuser
database.params.password = devsecret

Чтение конфигурации:

$config = new Zend_Config_Ini('/path/to/config.ini', 'staging');

echo $config->database->params->host;   // prints "dev.example.com"
echo $config->database->params->dbname; // prints "dbname"

Запись конфигурации:

// Load all sections from an existing config file, while skipping the extends.
$config = new Zend_Config_Ini('config.ini',
                              null,
                              array('skipExtends'        => true,
                                    'allowModifications' => true));

// Modify a value
$config->production->hostname = 'foobar';

// Write the config file
$writer = new Zend_Config_Writer_Ini(array('config'   => $config,
                                           'filename' => 'config.ini'));
$writer->write();

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

Этот тип конфигурации действительно удобен для чтения и редактирования.

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

2 голосов
/ 12 июля 2009

Рассматривали ли вы SQLite ?

Это легкая автономная база данных, которая по сути является файлом. База данных может использоваться локально или удаленно. Если вы можете сохранить свою конфигурацию в файле, она также может быть сохранена в базе данных SQLite.

Возможно, вы захотите рассмотреть JSON как еще один вариант для сериализации. Он теоретически по-прежнему удобочитаем для человека и имеет преимущество, заключающееся в том, что он более «Объект», как в его окончательном представлении, что может сделать код доступа немного проще. И еще одним преимуществом является то, что вы можете сохранить всю или часть модели на стороне клиента для обработки. Но тогда вы должны ввести в свое приложение какой-нибудь javascript, который может или не может быть тем, что вы хотите.

1 голос
/ 12 июля 2009

Я на самом деле не фанат этого, но один из достоинств конфигурации XML заключается в том, что она, по крайней мере, теоретически редактируется вручную. С сериализованным объектом PHP любой сложности назвать его редактируемым вручную было бы очень сложно; это лишь немного менее сложно и подвержено ошибкам, чем изменение строк в двоичном исполняемом файле с помощью шестнадцатеричного редактора.

Так что, если вы хотите дружелюбно настраивать редактирование файлов за пределами вашего интерфейса, сериализация объектов PHP не является подходящим способом. Если вас это не волнует, возможно, все будет хорошо.

Несмотря на это, я бы сильно подозревал, что пользовательский код для ваших узлов XML может быть в значительной степени выделен и обобщен.

0 голосов
/ 12 июля 2009

Если вам нравится макет структуры конфигурации, я думаю, вам было бы лучше выполнить рефакторинг существующей базы кода для обработчика конфигурации. Я не знаю, получишь ли ты большую выгоду от сериализации. Во всяком случае, я думаю, что было бы немного трудно отлаживать в случае изменения структуры.

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