2010-07-17 61 views
0

我是Symfony中的新成员,并且在逻辑代码组织方面存在问题。Symfony中缓存的不同版本

该问题与访客,登录用户和所有者的缓存和不同版本的网页相关。

例如。我有'用户'模块,它有'show'动作,URL是/ user/show /:id,每个访问者的URL都是一样的。但页面的内容取决于访问者,并且在'if'条件下选择,所以...如果我清除缓存并且第一位访客是访客,则其他人(包括所有者和登录用户)将看到访客的缓存页面。

某些解决方案可能会将每个视图(所有者,访客,登录用户)分隔为部分视图,但违反了DRY规则。

如何做到这一点?

回答

2

您可以使用sf_cache_key参数。 See here how。我认为你可以使用登录用户的user_id,前面加上一个任意字符串作为所有者,而来宾则可以使用字符串“guest”。

的伪代码有点帮助您进一步:

$sf_cache_key = ''; 
if ($visitor->isLogged()) 
{ 
    if ($visitor->getId() == $userId) 
    { 
     $sf_cache_key = 'owner' . $userId; 
    } 
    else 
    { 
     $sf_cache_key = 'logged_in' . $userId; 
    } 
} 
else 
{ 
    $sf_cache_key = 'guest' . $userId; 
} 
+0

我已经仔细阅读过文档。 案例研究:) 有配置文件页面(用户/显示/ 1),菜单等,如果我(ID = 2)打开该页面(用户/显示/ 1)它将被缓存。作为他的页面中的一位客人,我看到诸如“添加到朋友”或“发送消息”之类的按钮。当id = 1的用户打开他的主页时,他会看到带有按钮的缓存页面:/ 一个简单的解决方案将是所有者,客人和朋友的不同缓存,但是这有可能吗? Ofcourse我正在使用提到的sf_cache_key,但我不知道如何在这种情况下使用它。 我认为这只是有用的删除部分缓存.. – Marcin 2010-07-17 10:39:32

+0

我已编辑我的帖子,告诉你如何在这种情况下使用sf_cache_key。您只需指定许多不同的cache_key作为您想要的不同缓存版本。 – greg0ire 2010-07-17 10:57:08

+0

我没有注意到你已经编辑过帖子。解决方案非常简单..非常感谢greg0ire :) – Marcin 2010-07-17 11:32:09

0

我敢肯定,你解决了这个现在,和应用程序已经升级到最新版本。但是我通过包含一个过滤器在每个URL中设置用户特定参数来防止数据泄漏,从而大致解决了类似问题。这破坏了GA的报告,这是我目前的问题。在应用程序在应用程序

// Filter类/前端/ LIB/accessFilter.class.php

<?php 
class accessFilter extends sfFilter 
{ 
    public function execute($filterChain) 
    { 
     $context = $this->getContext(); 
     $context->getRouting()->setDefaultParameter('sw_user_id', $user_id);  
     $filterChain->execute(); 
    } 
} 

//筛选定义/前端/配置/ filters.yml

# insert your own filters here 
accessFilter: 
    class: accessFilter 

//在apps/frontend/config/routing.yml中的路由中使用

dashboard: 
    url: /dashboard/:sw_user_id/home 
    param: { module: dashboard, action: index }