2016-08-08 2 views
2

У меня есть определение сервиса, который выглядит следующим образом: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 format conversion: "calls" with string params - важные нюансы есть.

ответ

2

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

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

является использование облегченной folded block scalar. Ограничением для этого является то, что вы не можете избежать каких-либо специальных символов с обратными косыми чертами, но это не в вашем примере (причина, по которой вам нужно "" вокруг вашего скаляра, является то, что она начинается с @, которая является зарезервированным символом).

Затем вам также необходимо правильно представить структуру, которую у вас есть, поскольку уже указано @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')) 
+0

Мой ответ не добавляет пробелов в результирующую строку. вы получаете эту идею? – flyx

+0

@flyx Загрузите ее, а затем сбросьте ее, как и я. – Anthon

+1

Если реализация YAML по вашему выбору добавляет пробелы к скаляру в моем ответе, это не правильная реализация YAML. Спектр говорит, что [ Все символы верхнего и нижнего пробелов исключены из содержимого.] (Http://www.yaml.org/spec/1.2/spec.html#id2787839). – flyx

1

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

+0

Если вставить пробел между запятыми и обратными косыми чертами, то в кавычках скалярный получат два места, так же, как в примере (в двух средних линиях) – Anthon

+0

Ах да, я проглядел их. Обновлен ответ, чтобы не включать обратную косую черту, где нужны пространства - это проще, чем добавление пробела перед обратным слэшем. – flyx

+0

В Symfony это не выполняется: невозможно выполнить синтаксический анализ в строке 619 (рядом с "- -" @ = service ('AnotherService1'). Create (\ "). – Alex

Смежные вопросы