Symfony2 Использовать константу класса PHP в конфигурации YAML?
Я знаю, что это, вероятно, невозможно, но есть ли чистый способ использовать константу класса PHP в конфигурации/сервисах YAML/etc. файл для 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%
Это помогло бы поддерживать согласованность между ними.
Ответы
Ответ 1
В версиях до Symfony 3.2 впрыскивание PHP-констант работает только с XML:
<parameter key="my_service.my_const" type="constant">My\Bundle\DependencyInjection\MyClass::MY_CONST</parameter>
Если вы хотите сохранить yor yml файлы, вы можете просто импортировать xml файл в свой services.yml. Смешивание конфигурационных стилей может быть немного уродливым, но насколько я знаю, это единственный способ сделать это.
Если это не сработает для вас, мой комментарий к вашему вопросу применим.
Ответ 2
Для Symfony >= 2.4 вы можете использовать язык выражения
Пример:
'@=constant("Symfony\\Bridge\\Monolog\\Logger::INFO")'
Ответ 3
Как и в Symfony 3.2, также возможно использовать PHP-константы в файлах YAML с использованием специального синтаксиса !php/const:
:
parameters:
bar: !php/const:PHP_INT_MAX
Подробнее см. сообщение в блоге Symfony.
Ответ 4
Это возможно, но только при использовании кода eval'd, который обычно не одобряется.
Учитывая константу класса Permission:: ACCESS_NONE, например. вы можете сделать что-то подобное в файле yaml:
permission: ACCESS_NONE
и следующее в коде, где вы разбираете yaml:
eval("return \The\Complete\Namespace\To\Permission::".$context['permission'].";");
Это, конечно, прикольный код, но он работает.
Ответ 5
Должно быть возможно вставить аргумент как обычный текст в config и внутри класса __construct($constant1)
, а затем запросить константу через переменную с помощью функции constant($constant1)
.
Но я не уверен в глобальных константах здесь, потому что они не могут быть определены во время использования, но это не должно быть проблемой для констант класса с полным пространством имен, поскольку локатор пространства имен уже определен в момент вызова класс.
Пример конфигурации:
services:
my_service:
class: Some\Class
arguments:
- 'My\Bundle\DependencyInjection\MyClass::MY_CONST'
и метод класса класса:
public function __construct($arg1)
{
$myRequiredConstantValue = constant($arg1);
}
Ответ 6
Это должно работать
arguments:
- <?php echo My\Bundle\DependencyInjection\MyClass::MY_CONST."\n" ?>