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

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

PHP:
  1. if ($expires) {
  2.     $cacheFile = ‘element_’ . $key . ‘_’ . $plugin . Inflector::slug($name);
  3.     $cache = cache(‘views’ . DS . $cacheFile, null, $expires);
  4.     if (is_string($cache)) {
  5.         return $cache;
  6.     }
  7. }

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

●view側
PHP:
  1. <?php
  2. echo $this->;element(‘left_menu’);
  3. ?>;

の代わりに以下を挿入
PHP:
  1. <?php
  2. if(($element = Cache::read(‘left_menu’, ‘element’)) === false){
  3.     $element = $this->element(‘left_menu’);
  4.     Cache::write(‘left_menu’, $element, ‘element’);
  5. }
  6. echo $element;
  7. ?>

●コントローラ側
beforeFilterなどでエレメントキャッシュを定義し、
キャッシュが存在しない場合に限り、クエリを発行する。
PHP:
  1. $config = array(
  2.     ‘engine’ => ‘File’,
  3.     ‘duration’=> ‘+5 min’,
  4.     ‘path’ => CACHE . ‘views’ . DS,
  5.     ‘prefix’ => ‘element_’
  6. );
  7. Cache::config(‘element’, $config);</code>
  8.  
  9. if( Cache::read(‘left_menu’, ‘element’) === false ){
  10.     $areas = $this>Area>find(‘menu’));
  11.     $categories = $this>Category>find(‘menu’));
  12.     $this->set(compact(‘areas’, ‘categories’));
  13. }

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