yiiext/twig-renderer でビューをフラグメントキャッシュしたい
{{void(...)}}でなく{%do...%}で
前のエントリで{{void(this.endWedgit)}}と書きましたが、{%do this.endWidget %}でいいことがわかり修正しました。ごめんなさい。
フラグメントキャッシュとは
フラグメントキャッシュはページの断片をキャッシュする事を指します。 たとえば、ページ中に年間売り上げサマリの表がある場合、 リクエスト毎にこれを生成する時間をなくすために、この表をキャッシュに保持できます。
http://www.yiiframework.com/doc/guide/1.1/ja/caching.fragment
yiiのフラグメントキャッシュのいいところは1テンプレート内にキャッシュされるところ/されないところが混在できるのでキャッシュの都合でテンプレートを分離せず済むことです。CakePHPのエレメントキャッシュではテンプレートを分離しなければならなかった、ような記憶があるような。
twig-rendererでもフラグメントキャッシュが働くかどうか、テンプレートとして読みやすいかどうかを検証します。
書き換え
php のフラグメントキャッシュ
<?php if($this->beginCache($id)) { ?> ...キャッシュされるコンテンツ... <?php $this->endCache(); } ?>
twig-renderer のフラグメントキャッシュ
{% if (this.beginCache(id)) %} ...キャッシュされるコンテンツ... {% do this.endCache %} {% endif %}
いびつなコードですね。できれば beginCache/endCache だけで書きたいところです。テンプレートとしては読みにくいですか。
検証コード
protected/config/main.php - ファイルキャッシュを有効にする
'components'=>array( 'cache'=>array( 'class'=>'system.caching.CFileCache', ), ),
protected/views/site/index.twig - フラグメントキャッシュのテスト
<h3>予想</h3> #1 : uncached == cached<br> #2 : uncached != cached<br> #3 : uncached != cached<br> #4 : ..<br> uncache : {{ date|date('Y-m-d\TH:i:sP') }} {% if (this.beginCache(1)) %} cached : {{ date|date('Y-m-d\TH:i:sP') }} {% do this.endCache %} {% endif %}
検証結果
予想通り、1回目の表示では2つの日時が一致し、2回目以降は2つの日時がズレる、のように動作すると思います。
というわけで、twig-renderer でもフラグメントキャッシュが機能することがわかりました。テンプレートとしてはちょっと読みにくいか。