Dabits

サーバサイドから運営まで何でもやるエンジニア系DJ

cakephp1.2流のエレメントキャッシュ

サイドメニューなど、エレメントの部分だけキャッシュしたかったので、 マニュアルの3.9.3.2 エレメントをキャッシュするを見て、実装したのですが、 コントローラ側からCache::read();としても反応なし。 ・・・?と思いながらview.phpを眺めていると、以下の記述が。。。

[php] if ($expires) { $cacheFile = 'element' . $key . '' . $plugin . Inflector::slug($name); $cache = cache('views' . DS . $cacheFile, null, $expires); if (is_string($cache)) { return $cache; } } [/php]

あれ、cache();って1.1のやつだから非推奨のはずじゃぁ。。。 ってことで、cakephp1.2流のelementキャッシュを考えてみた。

●view側 [php] <?php echo $this->;element('left_menu'); ?>; [/php] の代わりに以下を挿入 [php] <?php if*1 === false){ $element = $this->element('left_menu'); Cache::write('left_menu', $element, 'element'); } echo $element; ?> [/php]

●コントローラ側 beforeFilterなどでエレメントキャッシュを定義し、 キャッシュが存在しない場合に限り、クエリを発行する。 [php] $config = array( 'engine' => 'File', 'duration'=> '+5 min', 'path' => CACHE . 'views' . DS, 'prefix' => 'element_' ); Cache::config('element', $config);

if( Cache::read('left_menu', 'element') === false ){ $areas = $this->Area->find('menu')); $categories = $this->Category->find('menu')); $this->set(compact('areas', 'categories')); } [/php]

これで劇早&1.2流のキャッシュができましたー!

*1:$element = Cache::read('left_menu', 'element'