如何格式化YAML以使其更具可读性

时间:2017-01-19 10:42:41

标签: php yaml symfony

我想改变这件YAML:

calls:
    - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
    - [ setTemplates, [{show: XxxBundle:PmodOrder:show.html.twig, edit: XxxBundle:PmodOrder:edit.html.twig, create: XxxBundle:PmodOrder:create.html.twig}]]

如何以更易读的方式对其进行格式化?我不喜欢在一条线上这么久。

我试过这个;

calls:
    - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
    setTemplates:
        - show: XxxBundle:PmodOrder:show.html.twig
        - edit: XxxBundle:PmodOrder:edit.html.twig
        - create: XxxBundle:PmodOrder:create.html.twig}]]

和这个;

calls:
    - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
    - setTemplates:
        - show: XxxBundle:PmodOrder:show.html.twig
        - edit: XxxBundle:PmodOrder:edit.html.twig
        - editTwo: XxxBundle:PmodOrder:create.html.twig

但它没有用,我无法找到关于这种格式的内容:- [ xxx, [{yyy: zzz, aaa: bbb}]]以及如何在更多行中分解它。

3 个答案:

答案 0 :(得分:2)

YAML流样式节点可以分成多行,只要它们至少包含周围块节点的缩进:

calls:
  - [ setReader, ["@sonata.admin.audit.manager",
                  "@doctrine.orm.default_entity_manager"]]
  - [ setTemplates, [{
        show:   XxxBundle:PmodOrder:show.html.twig,
        edit:   XxxBundle:PmodOrder:edit.html.twig,
        create: XxxBundle:PmodOrder:create.html.twig}]
    ]

也可以使用紧凑块符号,它允许多个列表项从同一行开始:

calls:
  - - setReader
    - - "@sonata.admin.audit.manager"
      - "@doctrine.orm.default_entity_manager"
  - - setTemplates
    - - show:   XxxBundle:PmodOrder:show.html.twig
        edit:   XxxBundle:PmodOrder:edit.html.twig
        create: XxxBundle:PmodOrder:create.html.twig

答案 1 :(得分:0)

这虽然有效,但我不知道它是否更容易阅读:

try2:
    class: AppBundle\Try2
    calls:
        - [ setReader, ["@doctrine.orm.default_entity_manager", "@doctrine.orm.default_entity_manager"]]
        -
            - setTemplates
            -
                -
                    show:   XxxBundle:PmodOrder:show.html.twig
                    edit:   XxxBundle:PmodOrder:edit.html.twig
                    create: XxxBundle:PmodOrder:create.html.twig

如果这是你自己的类,那么我建议创建一个addTempate($ name,$ file)方法然后只调用它三次。

答案 2 :(得分:0)

答案flyx为您提供了正确的解决方案,但没有说明您在试验中遇到的错误以找到解决方案,并且由于您在基于PHP的YAML解析器中遇到限制而无法解决问题symfony3正在使用。

此:

calls:
    - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
    setTemplates:
        - show: XxxBundle:PmodOrder:show.html.twig
        - edit: XxxBundle:PmodOrder:edit.html.twig
        - create: XxxBundle:PmodOrder:create.html.twig}]]

有问题。首先,通过在以calls开头的(流式样)序列元素之前使用短划线(-),使映射键[ setReader, ["@sonat...的值成为序列。然后在相同的缩进级别,您有一个映射键setTemplates,并且在YAML中不允许。也应删除尾随}]],因为它们不属于映射值XxxBundle:PmodOrder:create.html.twig}]]

您通过插入额外的短划线(并删除了尾随}]])修复了第二个示例中的语法错误,但没有注意到您通过映射实际删除了一个完整节点

setTemplates, [{show: XxxBundle:PmodOrder:show.html.twig, edit: XxxBundle:PmodOrder:edit.html.twig, create: XxxBundle:PmodOrder:create.html.twig}]]

序列的一个元素,它是calls的值,而不是calls值的序列序列的元素。

这个问题来自于尝试同时重写太多内容和/或从错误的一端开始。

  

在YAML中,如果要将流样式节点重写为块样式,则应从顶层开始并向内工作,这样就可以一步一步地完成。

这是因为流样式可以在自身内部和块样式内发生,但块样式不能在流样式内发生,只能在其他块样式内。

因此,重写的第一步应该是采用流式样的最外层序列并重写它(我使用2个空格缩进,因为如果考虑行长度,这似乎更合适):<​​/ p>

calls:
  - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
  - 
    - setTemplates
    - [{show: XxxBundle:PmodOrder:show.html.twig, edit: XxxBundle:PmodOrder:edit.html.twig, create: XxxBundle:PmodOrder:create.html.twig}]

你可以但不必在块样式序列中的块样式序列的第一个元素与父类在同一行上,但是ymL解析器symfony3使用不允许这个< / strong>即可。一般程序是:

  1. 将最外面的[替换为-
  2. 替换不在嵌套节点内的任何, **(不属于标量字符串的[]{}之间),-在换行符与第1步中的-缩进相同。
  3. 删除最终的]
  4. 如果您使用的是PHP,请将第一个-移动到新行,因为PHP解析器有限制。

    这不会减少行长度,所以在下一级重复上述步骤,这是一个只有一个元素的序列:

    calls:
      - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
      - 
        - setTemplates
        - 
          - {show: XxxBundle:PmodOrder:show.html.twig, edit: XxxBundle:PmodOrder:edit.html.twig, create: XxxBundle:PmodOrder:create.html.twig}
    

    现在攻击下一个级别,这是一个映射。其步骤如下:

    1. 删除最外面的{
    2. 替换不在嵌套节点内的任何, **(不属于标量字符串的[]{}之间),并对齐键(之前的部分)新行上的:与第1步中的键具有相同的缩进。
    3. 删除最终的}
    4. 如果任何键值对都被引用并且仅用冒号(:)而不是空格冒号分隔,请在冒号后面插入一个空格,并在可能的情况下选择性地删除引号。
    5. 最后一步不会影响您的代码,但可能需要更多JSON,例如YAML。

      执行这些步骤可以获得:

      calls:
        - [ setReader, ["@sonata.admin.audit.manager", "@doctrine.orm.default_entity_manager"]]
        - 
          - setTemplates
          - 
            - show: XxxBundle:PmodOrder:show.html.twig
              edit: XxxBundle:PmodOrder:edit.html.twig
              create: XxxBundle:PmodOrder:create.html.twig
      

      YAML在每一步都提供相同的加载结果。在[ setReader...部分应用相同的步骤,您就完成了:

      calls:
        - 
          - setReader
          - 
            - "@sonata.admin.audit.manager"
            - "@doctrine.orm.default_entity_manager"
        - 
          - setTemplates
          - 
            - show: XxxBundle:PmodOrder:show.html.twig
              edit: XxxBundle:PmodOrder:edit.html.twig
              create: XxxBundle:PmodOrder:create.html.twig
      

      如果您无法使用symfony3检查每个步骤,则可以使用PHP based YAML checker/converter检查每个步骤。它不是最好的解析器,但至少它具有与symfony3使用的相同的限制。