2010-07-17 63 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 }