Symfony + Smarty での 問題回避メモ

Symfony で Smarty は 使わない方がいいです

冒頭から否定的ですいませんが、現状では Symfony で Smarty は使わない方がいいです。
逆にメンドウ。

下記は Symfony + Smarty で作り始めて、引くに引けなくなった人のバッドノウハウです。


JavaScript が素直に書けない

ちょっとしたJavaScript関数だったらテンプレートに直書きしたい。
でも素直には書けない。・・・Smartyのデリミタが'{'と'}'だから。
普通は '{ldelim}' と '{rdelim}' を使うんだろうけど、JavaScriptヘルパーとの兼ね合いでもちろん使えません。
Smartyのデリミタを変更するとか、JavaScriptヘルパーいらねえ!とかやりようはいくらでもありますが、もはやテンプレートとは呼べない代物になる。

まぁ、このケースは'{php}'で逃げれたので、素直に逃げました。


再帰的に評価してくれない

こういうのをなんて言うのか知らんが、とりあえずダメって言われた。
//ダメ
{$hoge->$fuga()->piyo()}

//アリ
{$hoge->$fuga->piyo()}
返り値に対してさらに評価するって事が出来ない。
さらに、今回のケースは特殊で'{php}'使えませんでした。
使えない理由として'$hoge'はSmartyの'foreach'によって生成された変数で、'{php}'内からは参照できませんでした。

'foreach' 自体(全て)を'{php}'でやるっていうのが解決法だと思ったんだけど、なんかうまくイカンかった。
・・・で、結局'assign'使った。
{foreach item="hoge" from=$hoges}
{assign var="fuga" value=$hoge->fuga()}
~
	{$fuga->piyo()}
~
{/foreach}
'assign'を使って事前に戻り値を、テンプレート変数に追加する事で回避した。


静的な呼び出しが出来ない

どーしても 'app.yml' に記述したデータをテンプレートで使いたい状況が発生。
しかも、'layout.yml'で使いたいので、'action.class.php'とかで変数作ったりは変更箇所が多くてメンドウ。
良い方法を教えてください。それまでは自力でナントカ(下記参照)。

とりあえず、現状こうなります。
//シンタックスエラー
{sfConfig::get('hoge')}

//そんな子いません
{$sf_config->get('hoge')}
・・・困った。
'$sf_config' が無いのはナゼ? セキュリティ的な対応?
そもそも、'sfConfig'のインスタンスを作ってるとこ見たこと無い。

むー。。。しょうがないので、人の道に外れても'sfConfig'のインスタンスをテンプレート内で作ることにした。

まず、'$this'をダンプしてテンプレート変数の格納場所をサーチ。
・・・結果→'$this->_tpl_vars'
(※ここの'$this'のダンプは、悪意の無いブラクラですのでご注意を!)

では、準備がととのったので実装しましょう。
//$sf_configを生成
{php}
if(!isset($this->_tpl_vars['sf_config'])){
	$this->_tpl_vars['sf_config'] = new sfConfig();
}
{/php}

//$sf_configを使う
{$sf_config->get('hoge')}
はい、回避できました。
でもこの問題は、正しい回避策、あるいは仕様がありそう。
随時調査します。


--
役に立たないことばかりに時間を費やしているな!オレ!
Name
Email
Your website or blog
Comment
Security code (CAPTCHA™)