web-dev-qa-db-ja.com

Symfony2 Use PHP YAML Configのクラス定数?

これはおそらく不可能だと思いますが、Symfony2のYAML config/services/etc。ファイル内でPHPクラス定数を使用するクリーンな方法はありますか?

たとえば、私がこれを持っている場合:

namespace My\Bundle\DependencyInjection;

class MyClass
{
    const MY_CONST = 'cookies';
}

このようなことが可能ですか(.ymlファイルで):

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

これは、2つの間の一貫性を維持するのに大いに役立ちます。

20
samanime

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にインポートするだけです。設定スタイルを混在させるのは少し醜いかもしれませんが、私が知る限り、これがそれを行う唯一の方法です。

これがうまくいかない場合は、あなたの質問に対する私のコメントが適用されます。

16
dbrumann

Symfony> = 2.4の場合、 式言語 を使用できます

例:

'@=constant("Symfony\\Bridge\\Monolog\\Logger::INFO")'
21
Cmyker

Symfony 3.2以降、特別な!php/const:構文を使用してYAMLファイルでPHP定数を使用することも可能です。

parameters:
    bar: !php/const:PHP_INT_MAX

詳細については Symfonyブログ投稿 を参照してください。


注意してください:Symfony 4では構文 わずかに変更されました 。次に、二重コロンの代わりにスペースを使用する必要があります。

parameters:
    bar: !php/const PHP_INT_MAX

そうしないと、「通知:初期化されていない文字列オフセット」というメッセージとともにFileLoaderLoadExceptionが発生します。

17
kix

引数をプレーン 'テキスト'として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);
}
1
Peter Laboš

これは可能ですが、一般的に嫌われている評価済みコードを使用する場合に限ります。

クラス定数が与えられた場合Permission :: ACCESS_NONE例: yamlファイルで次のようなことを行うことができます:

_permission: ACCESS_NONE
_

yamlを解析するコードでは次のようになります。

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

これはもちろんお尻の醜いコードですが、機能します。

0
InputOutput