parser lib php symfony yaml

lib - ¿Symfony2 usa la constante de clase PHP en la configuración YAML?



php yaml parser (6)

Sé que esto probablemente no sea posible, pero hay una manera limpia de usar una constante de clase PHP dentro de una configuración / servicios / etc de YAML. archivo para Symfony2?

Por ejemplo, si tengo esto:

namespace My/Bundle/DependencyInjection; class MyClass { const MY_CONST = ''cookies''; }

Es algo como esto posible (en un archivo .yml):

services: my_service: class: Some/Class arguments: - %My/Bundle/DependencyInjection/MyClass::MY_CONST%

Eso ayudaría a mantener la consistencia entre los dos.


A partir de Symfony 3.2, también es posible usar constantes de PHP en archivos YAML usando una sintaxis especial !php/const: :

parameters: bar: !php/const:PHP_INT_MAX

Vea la publicación del blog de Symfony para más detalles.

Ten en cuenta que : en Symfony 4 la sintaxis se modificó ligeramente . Tienes que usar un espacio en lugar de dos puntos dobles, por ejemplo:

parameters: bar: !php/const PHP_INT_MAX

De lo contrario, obtendrá una excepción FileLoaderLoadException con el mensaje "Aviso: Desfase de cadena sin inicializar".


Debería ser posible insertar el argumento como ''texto'' sin formato en config y dentro de la clase __construct($constant1) luego solicitar la constante a través de la función de constant($constant1) por constant($constant1) .

Pero no estoy seguro de las constantes globales aquí, porque pueden no estar definidas en el momento de usarlas, pero no debería ser un problema para las constantes de clase con espacio de nombres completo, porque el localizador de espacios de nombres ya está definido en el momento de llamar a la clase.

Ejemplo de configuración:

services: my_service: class: Some/Class arguments: - ''My/Bundle/DependencyInjection/MyClass::MY_CONST''

y ejemplo de método de clase:

public function __construct($arg1) { $myRequiredConstantValue = constant($arg1); }


En versiones anteriores a Symfony 3.2, inyectar constantes de PHP solo funciona con XML:

<parameter key="my_service.my_const" type="constant">My/Bundle/DependencyInjection/MyClass::MY_CONST</parameter>

Si desea mantener los archivos yor yml, puede importar el archivo xml en su services.yml. Mezclar estilos de configuración puede ser un poco feo, pero por lo que sé, esta es la única manera de hacerlo.

Si esto no funciona para usted, se aplica mi comentario a su pregunta.


Esto debería funcionar

arguments: - <?php echo My/Bundle/DependencyInjection/MyClass::MY_CONST."/n" ?>


Esto es posible, pero solo cuando se usa el código eval, que generalmente está mal visto.

Dada una constante de clase Permission :: ACCESS_NONE, por ejemplo, puedes hacer algo como esto en el archivo yaml:

permission: ACCESS_NONE

y lo siguiente en el código donde se analiza el yaml:

eval("return /The/Complete/Namespace/To/Permission::".$context[''permission''].";");

Esto es, por supuesto, un código feo pero funciona.


Para Symfony> = 2.4 puedes usar el lenguaje de expresión

Ejemplo:

''@=constant("Symfony//Bridge//Monolog//Logger::INFO")''