2012-01-28 82 views
4

在阅读symfony 1.4的缓存行为后,我才知道symfony 1.4不考虑缓存模板的用户会话。如何在symfony 1.4中缓存会话相关数据?

现在,情况是,我有几个模板,其中有一部分代码取决于在用户会话..让我们说,如果用户通过身份验证,他有一个设施,问产品列表中的问题...现在我应该如何缓存此模板文件...我知道一件事,即为所有会话代码块创建单独的模板和将缓存设置为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 2014-06-20 14:42:34

+1

@hadrik当然!因为你永远不会有足够的基于堆栈溢出分数的狂妄自大,所以请随时加入积分并接受加分。 – cmc 2014-06-20 16:54:41

0

Hardik为您的应用程序变得越来越复杂,有一个页面上的动态和缓存内容的最好方法是使用局部和组件用自己的缓存设置。您只需要将主要部分分开来创建部分和组件以替换所有内容。然后,将这些较小的部分添加到不应缓存的nameYourTemplateSuccess.php中,否则将缓存所有部分/组件。

有关高速缓存部分和组件的更多信息here

0

I second @ 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 2014-06-20 14:42:57

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; ?>