tjtjtjのメモ

自分のためのメモです

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 でもフラグメントキャッシュが機能することがわかりました。テンプレートとしてはちょっと読みにくいか。