【问题标题】:Different version of the cache in SymfonySymfony 中不同版本的缓存
【发布时间】:2017-04-19 16:11:05
【问题描述】:

我是Symfony 的新人,我对逻辑代码组织有疑问。

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

例如。我有“用户”模块,它有“显示”操作,URL 是 /user/show/:id,每个访问者的 URL 都是相同的。但是页面的内容取决于访问者,并且使用“if”条件选择,所以......如果我清除缓存并且第一个访问者是访客,那么其他人(包括所有者和登录用户)将看到访客的缓存页面。

某种解决方案可以将每个视图(所有者、访客、登录用户)分离为部分视图,但这违反了DRY 规则。

如何做到这一点?

【问题讨论】:

    标签: caching symfony1


    【解决方案1】:

    您可以使用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;
    }
    

    【讨论】:

    • 我已经仔细阅读了文档。案例研究 :) 有个人资料页面(user/show/1),带有菜单等,如果我(id=2)打开该页面(user/show/1),它将被缓存。作为他页面的访客,我看到“添加到朋友”或“发送消息”等按钮。当 id=1 的用户打开他的主页时,他将看到带有按钮的缓存页面:/ 一个简单的解决方案是所有者、客人和朋友的不同缓存,但有可能吗?当然,我使用的是提到的 sf_cache_key,但我不知道在这种情况下如何使用它。我认为它只对删除部分缓存有用..
    • 我编辑了我的帖子,向您展示如何在这种情况下使用 sf_cache_key。您只需指定尽可能多的不同 cache_key 作为您想要的不同缓存版本。
    • 我没有注意到您编辑了帖子。解决方案是如此简单.. 非常感谢 greg0ire:)
    • Symfony 中的一切总是很简单 ;-)
    【解决方案2】:

    我确定您现在已经解决了这个问题,并且该应用程序已经升级到最新版本。但是我通过在每个 URL 中设置用户特定参数的过滤器来解决类似的问题,以防止数据泄漏。这会破坏 GA 中的报告,这是我目前的问题。

    //apps/frontend/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();
       }
    }
    

    //apps/frontend/config/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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2021-08-07
      • 2016-04-19
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      相关资源
      最近更新 更多