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