これはおそらく不可能だと思いますが、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つの間の一貫性を維持するのに大いに役立ちます。
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 3.2以降、特別な!php/const:
構文を使用してYAMLファイルでPHP定数を使用することも可能です。
parameters:
bar: !php/const:PHP_INT_MAX
詳細については Symfonyブログ投稿 を参照してください。
注意してください:Symfony 4では構文 わずかに変更されました 。次に、二重コロンの代わりにスペースを使用する必要があります。
parameters:
bar: !php/const PHP_INT_MAX
そうしないと、「通知:初期化されていない文字列オフセット」というメッセージとともにFileLoaderLoadExceptionが発生します。
引数をプレーン 'テキスト'として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);
}
これは可能ですが、一般的に嫌われている評価済みコードを使用する場合に限ります。
クラス定数が与えられた場合Permission :: ACCESS_NONE例: yamlファイルで次のようなことを行うことができます:
_permission: ACCESS_NONE
_
yamlを解析するコードでは次のようになります。
eval("return \The\Complete\Namespace\To\Permission::".$context['permission'].";");
これはもちろんお尻の醜いコードですが、機能します。