Symfony2 Use PHP Class Constant in YAML Config?

匿名 (未验证) 提交于 2019-12-03 01:59:02

问题:

I know this is probably not possible, but is there a clean way to use a PHP class constant within a YAML config/services/etc. file for Symfony2?

For example, if I have this:

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

Is something like this possible (in a .yml file):

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

That'd go a long way in helping maintain consistency between the two.

回答1:

In versions before Symfony 3.2, injecting PHP-constants only works with XML:

My\Bundle\DependencyInjection\MyClass::MY_CONST

If you want to keep yor yml files, you could just import the xml-file into your services.yml. Mixing config styles might be a bit ugly, but as far as I know this is the only way to do it.

If this doesn't work for you, my comment to your question applies.



回答2:

For Symfony >=2.4 you can use expression language

Example:

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


回答3:

As of Symfony 3.2, it's also possible to use PHP constants in YAML files using a special !php/const: syntax:

parameters:     bar: !php/const:PHP_INT_MAX 

See the Symfony blog post for more details.


Please note: In Symfony 4 the syntax was slightly changed. You have to use a space instead of a double colon, for example:

parameters:     bar: !php/const PHP_INT_MAX 

Otherwise, you will get a FileLoaderLoadException with the message "Notice: Uninitialized string offset".



回答4:

This is possible, but only when using eval'd code, which is generally frowned upon.

Given a class constant Permission::ACCESS_NONE e.g. you could do something like this in the yaml file:

permission: ACCESS_NONE 

and the following in the code where you parse the yaml:

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

This is of course butt-ugly code but it does work.



回答5:

It should be possible to insert argument as plain 'text' in config and inside class __construct($constant1) then request constant through variable by constant($constant1) function.

But I am not sure about global constants here, because they may not be defined at time of using, but it shouldn't be a problem for class constants with whole namespace, because namespace locator is already defined at moment of calling the class.

Example config:

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

and example class method:

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


回答6:

This should work

arguments:  - 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!