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


Symfony2 Use PHP Class Constant in YAML Config?

我知道这可能是不可能的,但有没有一种干净的方法可以在YAML配置/服务等中使用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%

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

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

parameters:
    bar: !php/const:PHP_INT_MAX

有关更多详细信息,请参阅Symfony的博客文章。


请注意:在Symfony 4中,语法略有更改。您必须使用空格而不是双冒号,例如:

parameters:
    bar: !php/const PHP_INT_MAX

否则,您将得到一个FileLoaderLoadException,并显示消息"注意:未初始化的字符串偏移量"。

对于Symfony>=2.4,您可以使用表达式语言

示例:

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

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

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

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

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

应该可以在配置和类__construct($constant1)内以纯"text"形式插入参数,然后通过constant($constant1)函数通过变量请求常量。

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

配置示例:

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

以及示例类方法:

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

这是可能的,但只有在使用eval代码时,这通常是不受欢迎的。

给定一个类常量Permission::ACCESS_NONE,例如,您可以在yaml文件中执行以下操作:

permission: ACCESS_NONE

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

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

这当然是一个丑陋的代码,但它确实有效。

arguments:
      - key_1: "value_1"
        !php/const App'Example::CONSTANT_1: 'value_0'

github问题:在YAML散列中使用PHP类常量

这应该能在中工作

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