将复杂配置持久化到文件(PHP)

将复杂配置持久化到文件(PHP),php,xml,oop,configuration,Php,Xml,Oop,Configuration,我有一个相当大的MVC PHP web应用程序(自定义,无框架),它使用几百行XML文件进行配置。配置数据有一个相当复杂的结构,它用XML非常优雅地表示,但使用DOM读写却不那么容易。所有对配置数据的读取和写入都通过一个config类,该类对每种类型的配置数据都有访问器方法。由于每个XML节点都不同,因此大多数方法都使用自己的自定义代码。这门课目前大约有2000行,我不喜欢。数据库不可用 我突然想到,保存配置数据的更好方法可能是创建一些配置类,并对文件使用对象序列化 处理复杂配置数据的最佳实践是

我有一个相当大的MVC PHP web应用程序(自定义,无框架),它使用几百行XML文件进行配置。配置数据有一个相当复杂的结构,它用XML非常优雅地表示,但使用DOM读写却不那么容易。所有对配置数据的读取和写入都通过一个config类,该类对每种类型的配置数据都有访问器方法。由于每个XML节点都不同,因此大多数方法都使用自己的自定义代码。这门课目前大约有2000行,我不喜欢。数据库不可用

我突然想到,保存配置数据的更好方法可能是创建一些配置类,并对文件使用对象序列化


处理复杂配置数据的最佳实践是什么?

我不是很喜欢它,但XML配置的优点之一是,它至少在理论上是手工编辑的。对于任何复杂的序列化PHP对象,将其称为手动可编辑将是一个真正的延伸;与使用十六进制编辑器修改二进制可执行文件中的字符串相比,它的难度和易出错性要小一些

因此,如果您想在界面外友好地进行配置文件编辑,PHP对象序列化不是一个好办法。不过,如果你不在乎这一点,事情可能会很顺利


值得一提的是,我强烈怀疑XML节点的自定义代码可以在很大程度上被分解和概括。

我并不真正喜欢它,但XML配置的一个优点是,它至少在理论上可以手工编辑。对于任何复杂的序列化PHP对象,将其称为手动可编辑将是一个真正的延伸;与使用十六进制编辑器修改二进制可执行文件中的字符串相比,它的难度和易出错性要小一些

因此,如果您想在界面外友好地进行配置文件编辑,PHP对象序列化不是一个好办法。不过,如果你不在乎这一点,事情可能会很顺利

值得一提的是,我强烈怀疑XML节点的自定义代码可以在很大程度上进行分解和泛化。

您考虑过吗

它是一个轻量级的独立数据库,本质上是一个文件。数据库可以在本地或远程使用。如果您能够将配置持久化到一个文件,那么也可以持久化到一个SQLite数据库

您可能想考虑JSON作为序列化的另一个选项。从理论上讲,它仍然是人类可读的,并且在其最终表示中更像“对象”,这可能会使访问代码更简单一些。另一个好处是,您可以将模型的全部或部分持久化到客户端进行处理。但是,你必须在你的应用程序中引入一些javascript,这可能是你想要的,也可能不是你想要的

你考虑过吗

它是一个轻量级的独立数据库,本质上是一个文件。数据库可以在本地或远程使用。如果您能够将配置持久化到一个文件,那么也可以持久化到一个SQLite数据库


您可能想考虑JSON作为序列化的另一个选项。从理论上讲,它仍然是人类可读的,并且在其最终表示中更像“对象”,这可能会使访问代码更简单一些。另一个好处是,您可以将模型的全部或部分持久化到客户端进行处理。但是,你必须在你的应用程序中引入一些javascript,这可能是你想要的,也可能不是你想要的

如果您喜欢配置结构的布局,我认为最好重构配置处理程序的现有代码库。我不知道你是否会从序列化中得到很多好处。如果有什么不同的话,我认为在结构发生变化的情况下进行调试会有点困难。

如果您喜欢配置结构的布局,我认为您最好重构配置处理程序的现有代码库。我不知道你是否会从序列化中得到很多好处。如果有什么不同的话,我认为在结构发生变化的情况下调试会有点困难。

INI文件是我在Zend Framework中存储配置的方式,请查看示例配置:

读取配置:

$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();
写入配置:

$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();
配置的每个节点都可以转换为数组,也可以使用复杂数组创建配置类实例并将其保存到文件中

这种类型的配置实际上是人类可读和可编辑的


也许您应该尝试创建一些类似的解决方案。

INI文件是我在Zend Framework中存储配置的方式,请查看示例配置:

读取配置:

$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();
写入配置:

$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();
配置的每个节点都可以转换为数组,也可以使用复杂数组创建配置类实例并将其保存到文件中

这种类型的配置实际上是人类可读和可编辑的

也许你应该尝试创建一些类似的解决方案