2017-01-19 18 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使用的限制相同。