20

我知道这可能是不可能的,但是有没有一种干净的方法可以在 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%

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

4

7 回答 7

21

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

例子:

'@=constant("Symfony\\Bridge\\Monolog\\Logger::INFO")'
于 2015-09-15T18:58:00.553 回答
21

从 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。

于 2016-07-08T18:24:41.783 回答
17

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

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

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

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

于 2013-02-06T09:40:24.353 回答
1

应该可以在配置和类中将参数作为纯“文本”插入,__construct($constant1)然后通过constant($constant1)函数通过变量请求常量。

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

示例配置:

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

和示例类方法:

public function __construct($arg1)
{
    $myRequiredConstantValue = constant($arg1);
}
于 2016-10-25T15:12:53.600 回答
0

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

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

permission: ACCESS_NONE

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

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

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

于 2014-09-04T09:22:38.597 回答
0
arguments:
      - key_1: "value_1"
        !php/const App\Example::CONSTANT_1: 'value_0'

github 问题:使用 PHP 类常量作为 YAML 哈希中的键

于 2021-11-09T10:28:29.170 回答
-6

这应该工作

arguments:
 - <?php echo My\Bundle\DependencyInjection\MyClass::MY_CONST."\n" ?>
于 2013-02-05T18:06:13.553 回答