警告:symfonyのキャッシュメカニズムはプライベートキャッシングをサポートしていません。誤って適用すると、データが漏洩します。
はcache.yml
を使用しないでください、どのような方法でセッションに依存したコンテンツのためのすべてのセッションによって制限され、特にコンテンツをcache.yml
を使用しないでください。 cache.yml は、ユーザが他のすべてのユーザに見た最初のバージョンを無条件で表示します。は、ログインしていないかどうかを示します。
はconditional cache filterを作成し、その代わり
条件付きキャッシュフィルタを使用してください。次の例では、すべてのページがキャッシュされ、資格情報がmyCredential
のすべてのユーザーに対して、最初のユーザーのバージョンがと表示されます。
// apps/myApp/lib/conditionalCacheFilter.php
class conditionalCacheFilter extends sfFilter() {
public function execute($filterChain) {
$context = $this->getContext();
$user = $context->getUser();
if ($user->isAuthenticated() && $user->hasCredential('myCredential')) {
foreach ($this->getParameter('pages') as $page) {
$context->getViewCacheManager()->addCache($page['module'], $page['action'], array('lifeTime' => 300));
}
}
// Execute next filter
$filterChain->execute();
}
}
# filters.yml
conditionalCache:
class: conditionalCacheFilter
param:
pages:
- { module: myModule, action: myAction }
cache: ~
ユースケース
これは、特定の資格を持つユーザーのみに表示されるデータ重いページに便利ですが、すべてのユーザーが同じページを取得します。クレデンシャル固有の統計情報ページのコレクションが良い例です。
代替使用
また、直接、フィルタにキャッシュに追加するページを指定することもできます。特定のページに対してのみ明示的にフィルタを有効にすることは、有用なフェールセーフになります。
// apps/backend/lib/conditionalCacheFilter.php
$context = $this->getContext();
$user = $context->getUser();
if ($user->isAuthenticated() && $user->hasPermission()) {
$context->getViewCacheManager()->addCache('myModule', 'myAction', array(
'withLayout' => true,
'lifeTime' => 3600,
));
}
#filters.yml
conditionalCache:
class: conditionalCacheFilter
pages:
- { module: myModule, action: myAction }
ない真のプライベートキャッシュ
symfonyはバイユーザーのプライベートキャッシュの規定を持っていません。このユースケースにはclient side cache control headers with the private settingを使用する必要があります。また、nginxリバースプロキシまたは同様のセットアップを使用することがあります。
出典
2014-03-06 14:34:38
cmc
感謝を。 – hardik
@hadrikもちろん!あなたはスタックオーバーフロースコアベースの傲慢さを十分に持つことができないので、私に余分なポイントを与えるために受け入れるだけでなく、upvoteを自由に感じてください。 – cmc