【问题标题】:How to format YAML to be more readable如何格式化 YAML 以提高可读性
【发布时间】:2017-01-19 10:42:40
【问题描述】:

我想改变这段 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}]] 以及如何将其分解为更多行。

【问题讨论】:

    标签: php yaml symfony


    【解决方案1】:

    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
    

    【讨论】:

    • 你的第一个例子很好。认为您可能对第二个有一些语法问题。至少我无法让它工作。
    • @Cerad 根据规范,它是有效的 YAML。如果 Symfony 无法解析它,那就是一个错误。 Symfony YAML 实现并不是我所听过的最准确的一种(我自己从未使用过)。为了比较,您可以检查NimYAML [我的工作] 或reference parser,两者都解析它没有错误。
    • 您可以将"@doctrine.orm.default_entity_manager"]] 一直推到第一列,这会使您的第一句话看起来不准确(“他们”是指节点还是多行?。
    • @Cerad 请注意,在这些示例中,symfony3 解析器无法处理 YAML,尽管 它是正确的 YAML。
    • @Anton - 第一个在 Symfony 中运行良好。我从中学到了一些东西。还是有点怀疑第二个。无论如何,这看起来像是另一个问题。
    【解决方案2】:

    虽然我不知道它是否更容易阅读,但这是可行的:

    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) 方法,然后只调用它 3 次。

    【讨论】:

    • class: AppBundle\Try2是哪里来的,@Mentos93原帖里没有。
    • @Anthon Try2 只是我为测试配置而编写的一个简单类。 Mentos 只是将其排除在他的问题之外,因为它并不真正相关。所有服务定义都需要一个类。至少在最新的依赖注入容器发布之前。
    【解决方案3】:

    答案 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 中,如果你想将流样式节点重写为块样式,你应该从顶层开始向内工作,这样你就可以一步一步地这样做。

    这是因为flow style可以出现在自身和block style中,但是block style不能出现在flow style中,只能出现在其他block style中。

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

    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 使用的 YAML 解析器不允许这样做。一般程序是:

    1. 将最外层的[ 替换为-
    2. 将任何不在嵌套节点内的, **(在不属于标量字符串的[]{} 之间)替换为在具有相同缩进的换行符上的-如第 1 步中的 -
    3. 删除最后的]

    如果您使用的是 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. 如果任何键值对都被引用并且仅由冒号 (:) 而不是带有空格的冒号分隔,请在冒号后插入一个空格,并在可能的情况下删除引号。

    这最后一步不会影响您的代码,但对于更多 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 使用的相同的限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2019-09-13
      相关资源
      最近更新 更多