解析YAML以检查结构

时间:2015-06-25 12:45:47

标签: symfony yaml symfony-forms

在Symfony2项目中,我想制作一个加载的配置文件,并为每个表单字段指示是否显示字段,是否需要显示字段,具体取决于&#的某些属性34;项目"实体。

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的attr的{​​{1}}部分动态是优雅的,所以例如如果它是类型的" textarea的"然后在$builder->add部分中期望定义行数的参数attr。这基本上意味着我需要定义YAML文档的正确结构:如果字段A存在且类型为"无论"然后期望字段B(甚至可能指定如果没有字段B则默认为" 4")等等。

我基本上需要一个结构化的解析器。考虑一下第一个孩子" fieldProperty属性是一个实体名称,因此解析器不必指望那里的某个单词,只需要字符串。以下子项的相同故事是字段名称(在下面的示例中,实体是" myProfile"以及2个字段是"姓名"以及"昵称") 。从那一刻开始,结构进入游戏。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

使用XML可以选择更多的工具。但是你只需要一个工具,或者像上面指出的一个方法,它对你有用。如果我是你,我就不会放弃YAML的可读性。

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

答案 1 :(得分:0)

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

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