ViewBagの使用方法に落とし穴があったのでメモ。
やりがちな誤った方法
例えばレイアウトテンプレートで、ある変数が設定されているときだけ、それを使用する、という記述がしたい場合、下記のように書きそうだが、これはNG。
{% if viewBag.canonical_url is not empty %}
<link rel="canonical" href="{{ viewBag.canonical_url|app }}">
{% endif %}
なぜなら変数、この例では canonical_url
は変数が存在しない場合に empty
と判定されないからだ。未確認だが、おそらくマジックメソッドとして処理されるためだろう。
ちなみに、is defined
でもダメだ。変数が存在しない場合に例外になってしまう。
{% if viewBag.canonical_url is defined %}
また、そもそも viewBag
コンポーネントがレイアウトやページに設定されていないと、エラーになる。
正解
下記のように、 viewBag
と変数の有無のチェックを empty
チェックの前に入れてやれば良い。
{% if viewBag is defined and viewBag.__isset('canonical_url') and viewBag.canonical_url is not empty %}
<link rel="canonical" href="{{ viewBag.canonical_url|app }}">
{% endif %}
なんともバグが混入しやすそうな仕様だ。早く改善したいもんだ。
StackOverflowにもう少し詳しく書いてあるので参考までに。