2017-01-19 15 views
1

我想改变这片YAML的:如何格式化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}]]以及如何打破它在更多的线路。

回答

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($名称,$文件)方法和然后调用它三次。

+0

'class:AppBundle \ Try2'来自哪里,它不在@ Mentos93原始文章中。 – Anthon

+1

@Anon Try2只是我写的一个简单的类来测试配置。曼陀斯刚刚离开了他的问题,因为它并不真正相关。所有服务定义都需要一个类。至少直到最新的依赖注入容器被释放。 – Cerad

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 
+0

你的第一个例子很好。认为你可能有一些语法问题与第二。至少我不能让它工作。 – Cerad

+0

@Cerad根据规范它是有效的YAML。如果Symfony不能解析它,那是一个错误。 Symfony YAML实现不是我听过的所有最准确的实现(从未自己使用过)。为了便于比较,您可以查看[NimYAML](https://nimyaml.org/testing.html)[我的工作]或[参考解析器](http://ben-kiki.org/ypaste/),两者都是解析它没有错误。 – flyx

+0

您可以将''@ doctrine.orm.default_entity_manager“]]'推到第一列,这会使您的第一个句子看起来不准确(是”他们“指的是节点还是多行? – Anthon

0

答案flyx给你一个正确的解决方案,但是并不表示你一直在做什么错在你的试验,以找到一个解决方案,并没有解决问题因为你遇到restr symfony3正在使用的基于PHP的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, ["@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空间的缩进,似乎如果线路长度是一个问题更合适):

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解析器symfony3使用的不允许此。的一般方法是:

  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. 如果任何键 - 值对都引用并通过只有一个冒号分开换行符(:)而不是col在空格上插入冒号后面的空格,并在可能时删除引号。

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