【補足記事】Smartyに連想配列をそのまま渡さない理由

こちらの記事の補足です。

上記の記事で、この配列を

$user = array(
    'id' => 1,
    'name' => 'msng',
    'url' => 'http://www.msng.info/',
);

Smarty のテンプレートに渡すところをこう書いたんだけど

$smarty->assign(compact('user'));

Smarty に変数を assign するときは
連想配列で渡すこともできるので、
これでいいんじゃないかという声をいただきました。

$smarty->assign($user);

確かにこれでも渡せますね。
こうするのと同じことなので。

$smarty->assign(array(
    'id' => 1,
    'name' => 'msng',
    'url' => 'http://www.msng.info/',
));

もちろんそれでもいいんですが、
これだとテンプレート側には
{$id} とか [$name} とかいう名前で渡っちゃうので
結局 {$id} が何の ID なのかわからないという
最初の問題に戻ってしまいます。

また、変数をそのまま assign() に渡せるのは
1次元目の添字が文字列の場合だけですね。
その文字列がそのままテンプレートでの変数名になるので。

それ以外の場合は結局何らかの名前をつけてアサインすることになるため
命名の規則を一貫させるのが面倒になっちゃう。

ロジック側とテンプレート側で
同じ名前、同じ構成の変数を使いたいので、
Smarty のテンプレートにアサインする変数には
常に元のデータが入った変数と同じ名前をつけて渡すようにしてます。

なのでこうしてます。
個人的にはこれが一番楽。

$smarty->assign(compact('user'));

compact() を使いたくない場合はこうですね。

$smarty->assign('user', $user);

ご意見ご質問ありがとうございました!

関連エントリ

  • このエントリーをはてなブックマークに追加