我有一些服务定义,如下所示:
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
和作为第二项的另一序列。该序列包含双引号标量。