わたねこコーリング

野良プログラマ発、日々のアウトプット

Silex + Twig : テンプレート中で PHP のスーパーグローバルにアクセス

Twig ネタふたたび。テンプレート中で PHPスーパーグローバル($_GET とか $_SERVER とかのアレ)を表示したいケースがあって、ルーティングプロシジャ毎の render でいちいちセットするのもちょっと切ないので、もうちょっと簡素な処理で何とかならないか調べてみました。結果、Twig_Extension_Staging::addGlobal() ってのを使ってグローバル変数を追加すればいいみたい。

Silex で TwigServiceProvider を登録した後で、before コールバック中でこんなふうに(↓)。

$app->before(function () use ($app) {
	$app['twig']->addGlobal('_get', $_GET);
});

テンプレート中では、当該変数が存在しない時の為に default フィルタをカマして(↓)。

<input type="text" name="hoge" value="{{ _get.hoge|default('') }}"/>

その都度 default フィルタ書くのがめんどかったら $_GET を、存在しないプロパティならヌルストリングを返す __get() をインプリメントしたオブジェクトでラップするとかすればいいかも。

グローバル変数に逃げるってあたりが作法的にアレかなぁと不安ですが、もしバッドノウハウだったら誰か突っ込んで下さい。