我有一个相当大的MVC PHP Web应用程序(自定义,没有框架),它使用数百行XML文件进行配置。配置数据具有相当复杂的结构,在XML中非常优雅地表示,但不容易使用DOM读取或写入。所有读取和写入配置数据都通过Config类进行,该类具有每种配置数据的访问方法。由于每个XML节点都不同,因此大多数方法都使用自己的自定义代码。这个班目前约2000行,我不喜欢它。数据库不可用。
我想到,保留配置数据的更好方法可能是创建一些配置类并将对象序列化用于文件。
处理复杂配置数据的最佳做法是什么?
答案 0 :(得分:2)
您考虑过SQLite吗?
它是一个轻量级的独立数据库,本质上是一个文件。数据库可以在本地或远程使用。如果您能够将配置保存到文件,则还应该可以保留到SQLite数据库。
您可能希望将JSON视为序列化的另一个选项。它在理论上仍然是人类可读的,并且具有更多“对象”的好处,就像它的最终表示一样,这可能使访问代码更简单一些。另一个好处是您可以将全部或部分模型持久保存到客户端进行处理。但是你必须在你的应用程序中引入一些javascript,这可能是也可能不是你想要的。
答案 1 :(得分:2)
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 :(得分:1)
我并不是它的粉丝,但XML配置的一个优点是它至少在理论上是手工编辑的。使用任何复杂的序列化PHP对象,将其称为可手动编辑将是一个真正的延伸;与使用十六进制编辑器修改二进制可执行文件中的字符串相比,它只会稍微困难且容易出错。
因此,如果您想在界面之外配置文件编辑,那么PHP对象序列化就不是一种方法。但是,如果你不关心这一点,它可能会很好。
对于它的价值,我强烈怀疑你的XML节点的自定义代码可以在很大程度上被排除和推广。
答案 3 :(得分:0)
如果您喜欢配置结构的布局,我认为您最好重构配置处理程序的现有代码库。我不知道你是否会从序列化中获得很多好处。如果有的话,我认为如果结构发生变化,调试会有点困难。