Symfony2 utilise la constante de classe PHP dans la Config YAML?

je sais que ce n'est probablement pas possible, mais y a-t-il une façon propre d'utiliser une constante de classe PHP dans une config/services/etc. YAML. un dossier pour Symfony2?

Par exemple, si j'ai ceci:

namespace MyBundleDependencyInjection;

class MyClass
{
    const MY_CONST = 'cookies';
}

Est quelque chose comme cela possible (dans une .fichier yml):

services:
    my_service:
        class: SomeClass
        arguments:
            - %MyBundleDependencyInjectionMyClass::MY_CONST%

cela aiderait beaucoup à maintenir la cohérence entre les deux.

19
demandé sur j0k 2013-02-05 22:00:44

6 réponses

dans les versions antérieures à Symfony 3.2, l'injection de PHP-constantes ne fonctionne qu'avec XML:

<parameter key="my_service.my_const" type="constant">My\Bundle\DependencyInjection\MyClass::MY_CONST</parameter>

Si vous voulez garder votre yml fichiers, vous pouvez simplement importer le fichier xml dans vos services.yml. Mélanger des styles de configuration peut être un peu moche, mais pour autant que je sache, c'est la seule façon de le faire.

Si cela ne fonctionne pas pour vous, mon commentaire à votre question s'applique.

15
répondu dbrumann 2016-07-08 19:24:49

Pour Symfony >=2.4 vous pouvez utiliser expression de la langue

Exemple:

'@=constant("Symfony\Bridge\Monolog\Logger::INFO")'
19
répondu Cmyker 2015-09-15 18:58:00

à partir de Symfony 3.2, il est également possible d'utiliser les constantes PHP dans les fichiers YAML en utilisant un!php/const: syntaxe:

parameters:
    bar: !php/const:PHP_INT_MAX

voir le Symfony blog pour plus de détails.


remarque: en Symfony 4 la syntaxe a été légèrement modifié. Vous devez utiliser un espace au lieu d'un double deux-points, par exemple:

parameters:
    bar: !php/const PHP_INT_MAX

sinon, vous obtiendrez une FileLoaderLoadException avec le message " Notice: Uninitialized string offset".

16
répondu kix 2018-02-01 12:14:16

il devrait être possible d'insérer l'argument en tant que simple 'text' dans la config et dans la classe __construct($constant1) puis demande constante à travers la variable par constant($constant1) fonction.

mais je ne suis pas sûr des constantes globales ici, parce qu'elles peuvent ne pas être définies au moment de l'utilisation, mais cela ne devrait pas être un problème pour les constantes de classe avec namespace entier, parce que namespace Localisateur est déjà défini au moment de l'appel de la classe.

exemple de configuration:

services:
    my_service:
        class: Some\Class
    arguments:
        - 'My\Bundle\DependencyInjection\MyClass::MY_CONST'

et l'exemple méthode de la classe:

public function __construct($arg1)
{
    $myRequiredConstantValue = constant($arg1);
}
1
répondu Peter Laboš 2016-10-25 15:12:53

C'est possible, mais seulement en utilisant le code eval'D, ce qui est généralement mal vu.

avec une constante de classe Permission:: ACCESS_NONE par exemple, vous pouvez faire quelque chose comme ça dans le fichier yaml:

permission: ACCESS_NONE

et suivants du code où vous analysez le yaml:

eval("return \The\Complete\Namespace\To\Permission::".$context['permission'].";");

il s'agit bien sûr d'un code laid au cul, mais ça marche.

0
répondu InputOutput 2014-09-04 12:31:57

Cela devrait fonctionner

arguments:
 - <?php echo My\Bundle\DependencyInjection\MyClass::MY_CONST."\n" ?>
-5
répondu jonhattan 2013-02-05 18:06:13