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