Symfony2 Использовать константу класса PHP в конфигурации YAML? - программирование
Подтвердить что ты не робот

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%

Это помогло бы поддерживать согласованность между ними.

4b9b3361

Ответ 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" ?>