2012-01-28 9 views
4

symfony 1.4のキャッシュ動作を読んだ後、symfony 1.4がテンプレートをキャッシュするためのユーザセッションを検討していないことがわかりました。symfony 1.4でセッション依存データをキャッシュする方法は?

今、状況によっては、依存するコードのいくつかの部分がありますユーザーセッションでは、ユーザーが認証されているとしましょう。製品リストに質問する機能があります。このテンプレートファイルをキャッシュする必要があります。その1つは、セッションコードブロックとテンプレートキャッシュをfalseに設定します。しかし、私はあなたが持っている場合は、他のスマートな方法を知りたい...

は のHardik

答えて

3

警告: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リバースプロキシまたは同様のセットアップを使用することがあります。

+0

感謝を。 – hardik

+1

@hadrikもちろん!あなたはスタックオーバーフロースコアベースの傲慢さを十分に持つことができないので、私に余分なポイントを与えるために受け入れるだけでなく、upvoteを自由に感じてください。 – cmc

0

アプリケーションがページ上のダイナミックでキャッシュされたコンテンツを持っているための最良の方法は、独自のキャッシュ設定を部分的およびコンポーネントを使用することで、ますます複雑になるにつれてのHardik。すべての内容を置き換えるために、部分とコンポーネントを作成するメインセクションを切り離すだけです。次に、この小さい部分をキャッシュされるべきでないYourTemplateSuccess.phpという名前に追加します。そうでない場合は、すべての部分/コンポーネントがキャッシュされます。

部分およびコンポーネントのキャッシュに関する詳細here

0

@ dlonderoのパラメータの部分的キャッシングは、これまで私が今まで認識していなかったものです。

以前のプロジェクトでは、セッションベースの値に基づいてアクションレベルでキャッシュする、変更されたキャッシングフィルタとマネージャを実装しました。それはあなたがこの方法であなたのテンプレートをキャッシュすることができ

https://github.com/yitznewton/freerms/blob/master/apps/resolver/lib/view/freermsResolverCacheManager.class.php

https://github.com/yitznewton/freerms/blob/master/apps/resolver/lib/filter/freermsResolverCacheFilter.class.php

+0

答えてくれてありがとう答えを – hardik

1

アクションの結果全体(つまりはただパーシャルない/コンポーネント)をキャッシュするように、これは(?)、より効率的かもしれ

<?php $cache_str='something-that-is-uniq-'.$sf_user->isAuthenticated()?$sf_user->getGuardUser()->getId():''; 
<?php if (!cache($cache_str,36000)): ?> 
<div> something that you want to cache </div> 
    <?php cache_save(); ?> 
<?php endif; ?> 
関連する問題