Symfony YAML格式转换


Symfony YAML format conversion

我有一些服务定义,如下所示:

MyService:
    class: Some'Class'Here
    factory:
        - SomeFactoryHere
        - method
    calls:
        - [add, ["@=service('AnotherService1').create(service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))"]]

IMHO,如果转换成这样的东西,它会更可读:

MyService:
    class: Some'Class'Here
    factory:
        - SomeFactoryHere
        - method
    calls:
        -
          add,
          "@=service('AnotherService1').create(
              service('AnotherService2'),
              service('AnotherService3'),
              service('AnotherService3')
          )"

但是,这不是有效的YAML(Symfony解析器失败(,我的问题是如何将此配置转换为上面的内容?

UPD#1

看看Symfony YAML格式转换:;呼叫";有了字符串params,就有了重要的细微差别。

分解字符串的最佳方法

"@=service('AnotherService1').create(service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))"

是通过使用剥离的折叠块标量。这方面的限制是,您不能用反斜杠转义任何特殊字符,但这些字符不在您的示例中(您需要在标量周围使用""的原因是因为它以保留字符@开头(。

然后,您还必须正确地重新表示您所拥有的结构,正如@flyx已经指出的那样:calls的值是一个序列,其中第一个元素是标量add的列表,以及由前面提到的长标量组成的序列,为了可读性,您想将其分解:

import yaml
yaml_str = """'
MyService:
    class: Some'Class'Here
    factory:
        - SomeFactoryHere
        - method
    calls:
        - - add
          - - >-
              @=service('AnotherService1').create(
              service('AnotherService2'),
              service('AnotherService3'),
              service('AnotherService3'))
"""
data = yaml.safe_load(yaml_str)
print(data)

给出:

"@=service('AnotherService1').create( service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))"

请注意,这在.create(service(之间提供了额外的空间。

Symphony使用的YAML解析器似乎无法解析上述内容(尽管它是正确的(。您也可以尝试:

MyService:
    class: Some'Class'Here
    factory:
        - SomeFactoryHere
        - method
    calls:
        - 
          - add
          - 
            - >-
              @=service('AnotherService1').create(
              service('AnotherService2'),
              service('AnotherService3'),
              service('AnotherService3'))

您所写的是有效的YAML。如果Symfony解析器失败,那么它就有一个错误。但是无论如何,第二个YAML并不表示与第一个YAML相同的结构。

在第一个YAML中,calls是一个序列。calls的第一个序列项也是一个序列,它包含标量add和另一个序列。在第二个YAML中,calls也是一个序列,但它包含的项是一个标量,它包含从add,)"的所有内容。这里的逗号是内容,因为您没有启动流序列(使用[(。这里是块样式的YAML,它相当于第一个YAML:

MyService:
    class: Some'Class'Here
    factory:
        - SomeFactoryHere
        - method
    calls:
        - - add
          - - "@=service('AnotherService1').create('
                 service('AnotherService2'),
                 service('AnotherService3'),
                 service('AnotherService3')'
              )"

字符串行末尾的反斜杠不会导致插入空白。默认情况下,YAML为遇到的双引号字符串中的每一个换行符插入一个空格字符。这个YAML标量产生的字符串与您的第一个YAML包含的字符串完全相同。

- -是紧凑型,它一次启动两个嵌套的序列项。所以现在,calls又是一个以序列为第一项的序列。该嵌套序列包含作为第一项的标量add和作为第二项的另一序列。该序列包含双引号标量。