Symfony2在YAML配置中使用PHP类常量?

时间:2013-02-05 18:00:44

标签: php symfony yaml

我知道这可能不可能,但是在YAML config / services / etc中使用PHP类常量是否有一种干净的方法。 Symfony2的文件?

例如,如果我有这个:

namespace My\Bundle\DependencyInjection;

class MyClass
{
    const MY_CONST = 'cookies';
}

这样的事情是可能的(在.yml文件中):

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

这有助于保持两者之间的一致性。

6 个答案:

答案 0 :(得分:19)

对于Symfony> = 2.4,您可以使用expression language

示例:

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

答案 1 :(得分:17)

从Symfony 3.2开始,也可以使用特殊的!php/const:语法在YAML文件中使用PHP常量:

parameters:
    bar: !php/const:PHP_INT_MAX

有关详细信息,请参阅Symfony blog post

请注意:在Symfony 4中使用语法was slightly changed。您必须使用空格而不是双冒号,例如:

parameters:
    bar: !php/const PHP_INT_MAX

否则,您将收到FileLoaderLoadException,并显示消息“Notice:Uninitialized string offset”。

答案 2 :(得分:16)

在Symfony 3.2之前的版本中,注入PHP常量仅适用于XML:

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

如果要保留yml文件,可以将xml文件导入services.yml。混合配置样式可能有点难看,但据我所知,这是唯一的方法。

如果这对你不起作用,我对你的问题的评论就适用了。

答案 3 :(得分:1)

应该可以插入参数作为普通文本&#39;在配置和内部类__construct($constant1)中,然后通过constant($constant1)函数通过变量请求常量。

但是我不确定这里的全局常量,因为它们在使用时可能没有定义,但对于具有整个命名空间的类常量来说它不应该是一个问题,因为命名空间定位器已经定义了打电话给班级。

示例配置:

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

和示例类方法:

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

答案 4 :(得分:0)

这是可能的,但仅限于使用eval'd代码时,通常不赞成。

给定一个类常量Permission :: ACCESS_NONE,例如你可以在yaml文件中做这样的事情:

permission: ACCESS_NONE

以及解析yaml的代码中的以下内容:

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

这当然是非常丑陋的代码,但确实有效。

答案 5 :(得分:-5)

这应该有效

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