【问题标题】:INI Parsing with validation of required fieldsINI 解析与必填字段的验证
【发布时间】:2011-04-27 19:07:01
【问题描述】:

我有一个相当大的 INI,我会对其进行解析和验证,以确保已设置所有必需的设置。如果我需要添加/删除 INI 设置,这将是一个巨大的痛苦。

在我的 PHP 脚本中,我使用如下内容:

$ini = parse_ini_file($this->ini_filename, true);

// Debug Settings
if(isset($ini['debug_settings']['debug'])) {
    $this->debug = $ini['debug_settings']['debug'];   
} else {
    $this->failedINIValidation("['debug_settings']['debug'] not configured in the INI file: ");
}

failedINIValidation() 向我发送一封电子邮件,其中包含缺少的 INI 字段/值/等...

想让这个更通用,有什么想法吗?

【问题讨论】:

  • 我的建议是不要使用 INI...使用 XML,制作 XSD 并通过架构使用验证...让 libxml 为您完成工作..那么您只需要更改架构和 XML 配置。例如:php.net/manual/en/domdocument.schemavalidate.php#62032 现在您可能必须编写一些专门的代码来为 libxml 生成的错误提供更多上下文,但我认为这可能非常通用,因为您可以访问原始错误信息并可以从那里抽象出来您的特殊错误类型/消息应该或多或少保持不变。
  • 可以理解使验证更容易,但我仍然必须对 setter/getter 有一些逻辑,除非我遗漏了什么?
  • 什么setter/getter?我认为这是一个简单的验证器,而不是直接使用的完整配置对象...基本上您只需验证 XML...然后您将该 xml 转换为一个数组以在您的实际应用程序中使用(或包装在配置对象中的数组)... 您当然可以直接使用 XML 文档并使用 xpath 从中提取值,但这似乎有点过头了。您的验证器和配置对象应该彼此分开。如果您需要将 xml 转换为通用数组的示例逻辑,请查看Zend_Config_Xml 的代码。
  • 我以前用过这个,但它似乎比一个 ini 文件开销更大:stackoverflow.com/questions/2380755/…
  • 这就是我为什么要转换为数组的原因......然后你只有解析和转换的开销,之后你就可以处理普通数组了。我会忽略解析转换的开销,特别是因为我会将数组的序列化版本缓存在磁盘上。这样,您唯一的解析和转换配置文件更改。我说每次添加或删除配置值时修改应用程序代码是公平的交易。

标签: php validation ini


【解决方案1】:

只是把这个作为一个想法扔掉,已经很晚了,我累了,但是一个包含你想要检查的结构的定义数组怎么样,运行一个array_diff,然后循环结果(如果有的话)到拨打failedINIValidation

然后,如果您想在 INI 文件中添加或删除任何需要的内容,您只需从数组中删除该项即可。

除非您的 INI 文件非常复杂,否则我不会担心开销。我运行了一些快速而肮脏的基准测试来验证我在其他地方看到的声明:使用 parse_ini_file 比包含包含本机 array 对象的配置文件更快。

【讨论】:

  • 使用有效的配置文件进行比较可能就足够了。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2010-11-26
相关资源
最近更新 更多