我知道这可能不可能,但是在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%
这有助于保持两者之间的一致性。
答案 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" ?>