公開されている Smarty View class などで、そのままSmartyのキャッシュ機能を利用しようとすると、ページを移動しても内容が切り替わらないという問題が発生する。
これは、CakePHPが、layoutテンプレートから、対象のURLに対応したviewテンプレートを呼び出す仕組みになっているのが原因だ。
CakePHPでは、最終出力されるのは、layoutテンプレートの為、layoutテンプレートにSmartyのキャッシュが適用された場合、対象URLのviewが呼び出されなくなってしまう。
その結果、ページ遷移しても同じページが表示されてしまうようだ。
ページごとにlayoutファイルを作る?!こりゃやれんわ。
CakePHPはせっかくキャッシュ機能があるのに表示速度を落としてまでSmartyは利用する意味って。。
と思ってたらこれを回避する方法もちゃんとあった。
パラメータごとにキャッシュ・データを切り替える
Smartyでは、display()や、fetch()などを利用する際に第二引数に、任意の値を与えると、その値ごとのキャッシュが生成される。
これを利用して、第二引数に、各ページを一意に特定するパラーメータを引き渡せば、そのパラメーターごとにlayoutのキャッシュが生成できる。
Smarty View class では、_render メソッドで、smarty の fetch メソッドを利用して出力データを生成しているので、ここを訂正する。
$out = $this->Smarty->fetch($___viewFn,md5(serialize($_GET)));
ここでは、$_GETをシリアライズした値をさらにハッシュに変換した値を「ページを特定する一意の値」としている。
こうすれば、URLを$_GETに変換しているCakePHPでは、URLごとに別のlayout用のキャッシュが生成されるので、キャッシュ機能を維持しつつ、ページ遷移を正常に動作させる事ができる。
ただ、この方法だとハンパない数のキャッシュファイルができあがってしまうので、ディスク容量には注意が必要。
- Newer: ブログタイトルを変更
- Older: 「CakePHPとSmartyのススメ」ページ全面更新