【问题标题】:Parsing YAML to check structure解析 YAML 以检查结构
【发布时间】:2015-06-25 12:45:46
【问题描述】:

在 Symfony2 项目中,我想制作一个配置文件,该文件被加载并给出指示,对于每个表单字段,是否显示该字段,以及是否需要,取决于“项目”的某些属性" 实体。

parameters:
    fieldProperty:
        MyProfile:
            Name:
                Label: 'Your name'            
                ProjectType:
                    IT: 2
                    Non-It: 2
                    Hybrid: 2
                ProjectSize:
                    Small: 2
                    Medium: 2
                    Large: 2
                    Massive: 2
                ProjectComplexity:
                    Low: 2
                    Medium:  2
                    High: 2
                ProjectTimingUrgency:
                    Regular: 2
                    Urgent: 2
                    Mandatory: 2
                    Critical: 2
                    HighlyCritical: 2
                Sensitivity: 'none'
            Nickname:
                Label: 'Your nickname'            
                ProjectType:
                    IT: 0
                    Non-It: 0
                    Hybrid: 0
                ProjectSize:
                    Small: 0
                    Medium: 0
                    Large: 0
                    Massive: 0
                ProjectComplexity:
                    Low: 0
                    Medium:  0
                    High: 1
                ProjectTimingUrgency:
                    Regular: 0
                    Urgent: 0
                    Mandatory: 0
                    Critical: 0
                    HighlyCritical: 1
                Sensitivity: 'none'

我还使用它来确定给定字段的表单标签。考虑到我有类似 2000 个字段的内容,我认为让 formBuilder 的 $builder->addattr 部分动态化会很优雅,例如,如果它的类型为“textarea”,那么在 attr定义行数的参数rows。这基本上意味着我需要定义 YAML 文档的正确结构:如果字段 A 存在并且类型为“whatever”,则期望字段 B(甚至可能指定如果没有字段 B,则默认为"4") 等等。

我基本上需要一个结构化解析器。考虑到 fieldProperty 属性的第一个“子项”是实体名称,因此解析器不必期待某个单词,只需要字符串。以下子字段名称的情况相同(在下面的示例中,实体是“myProfile”,两个字段是“名称”和“昵称”)。从那一刻起,结构开始发挥作用。

在 YAML 中是否可行,或者我必须切换到对人类不太友好的 XML?

【问题讨论】:

  • 在使用不同的关键字进行谷歌搜索后,我发现它在 YAML“本身”中是不可行的,但有像 Rx 或 Kwalify 这样的解决方案可能会有所帮助。

标签: symfony yaml symfony-forms


【解决方案1】:

您需要以某种方式指定您的结构,Kwalify 或其他一些架构验证器可以帮助您。

但是,如果您熟悉编程,则可以在 YAML 中做一些事情。有趣的是,您的 YAML 文件仅包含基本标量、映射和序列,但您的描述似乎表明映射更像具有(或应该具有)某些属性的对象。

使用标准 YAML 标签,您可以指示某些节点​​代表的对象类型,但要检查值或值的存在,您需要在程序中拥有这些对象(我已经使用 Python 和 ruamel.yaml 包¹,但其他语言和解析器也应该可以工作)。

此外,您还需要手动添加标签。如果您可以通过读取映射/序列树并使用不需要标记的某些算法替换节点来自动执行此标记分配,则可以只运行这些分配,然后让对象检查您为其类指定的规则。在源代码中添加标签可能会混淆 symfony2,在这种情况下,您必须先预处理(手动)标记的 YAML,然后才能使用它(通常安全加载和转储就足够了)。

有更多的工具可以使用 XML 执行此操作。但是您只需要一种适合您的工具或一种如上所述的方法。所以如果我是你,我还不会放弃 YAML 的可读性。


¹ 虽然我的 YAML 往返包 ruamel.yaml 是开源的(它是 PyYAML 的增强版本),但不幸的是,我使用对象验证 YAML 的代码不是。

【讨论】:

    【解决方案2】:

    为什么不使用这里解释的集成 Symfony TreeBuilders:

    https://symfony.com/doc/current/components/config/definition.html

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2019-01-17
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      相关资源
      最近更新 更多