yml parser parameter online lib php symfony format yaml config

php - parser - yaml editor online



Conversión de formato Symfony YAML (2)

Lo que escribiste es válido YAML. Si el analizador Symfony falla, tiene un error. Pero de todos modos, el segundo YAML no representa la misma estructura que el primer YAML.

En el primer YAML, las calls son una secuencia. El primer elemento de la secuencia de calls es también una secuencia, que contiene el escalar add y otra secuencia más. En el segundo YAML, las calls también son una secuencia, pero el elemento que contiene es un escalar que contiene todo, desde add, hasta )" . La coma está contenida aquí, porque no comenzó una secuencia de flujo (con [ ). Aquí está estilo de bloque YAML que es equivalente al primer YAML:

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

Las barras invertidas al final de las líneas de la cadena no provocan que se inserte un espacio en blanco. De forma predeterminada, YAML inserta un carácter de espacio para cada línea nueva en una cadena de comillas dobles que encuentra. Este escalar YAML produce exactamente la misma cadena que su primer YAML.

- - es un estilo compacto, que inicia dos elementos de secuencia anidados a la vez. Entonces ahora, las calls son una secuencia de nuevo con una secuencia como primer elemento. esa secuencia anidada contiene un escalar add como primer elemento, y otra secuencia como segundo elemento. Y esa secuencia contiene el escalar de doble cita.

Tengo una definición de servicio que se ve así:

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

En mi humilde opinión, esto puede ser más legible si se convierte en algo como esto:

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

Pero, esto no es válido YAML (el analizador Symfony falla), y mi pregunta es ¿cómo se puede convertir esta configuración a algo como lo de arriba?

UPD # 1

Mire la conversión de formato de YAML de Symfony: "llama" con parámetros de cadena - hay importantes matices.


La mejor manera de romper tu cuerda

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

es mediante el uso de un escalar de bloque plegado pelado. La limitación para esto es que no puede escapar de ningún carácter especial con barras diagonales inversas, pero esos no están en su ejemplo (la razón por la que necesita "" alrededor de su escalar es porque comienza con un @ que es un carácter reservado).

Luego también tiene que volver a representar correctamente la estructura que tiene, como @flyx ya se indicó: el valor para las calls es una secuencia, el primer elemento de la cual es una lista de la secuencia y el escalar compuesto por el escalar largo antes mencionado que quieres romper para la legibilidad:

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)

da:

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

Tenga en cuenta que esto le da un espacio extra entre .create( y service( .

El analizador YAML que usa Symphony parece no ser capaz de analizar el anterior (aunque es correcto). Alternativamente, puedes probar:

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