Преобразование формата Symfony YAML

У меня есть некоторое определение сервиса, которое выглядит так:

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

ИМХО, это может быть более читабельным, если преобразовать в нечто вроде этого:

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: "звонки" со строковыми параметрами — важные нюансы есть.

2

Решение

Лучший способ разбить вашу строку

"@=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(,

Синтаксический анализатор YAML, который использует Symphony, кажется, не в состоянии проанализировать вышеизложенное (хотя это правильно). Вы также можете попробовать:

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

Другие решения

То, что вы написали, действительно 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 в качестве первого элемента, а другая последовательность в качестве второго элемента. И эта последовательность содержит скаляр в двойных кавычках.

1

По вопросам рекламы ammmcru@yandex.ru