2011-10-07 132 views
2

我遇到symfony會話值處理問題。Symfony會話值丟失

基本上,問題是這樣的,我有一個激活的動作過濾器,它將模塊和動作的值執行並將它們存儲在超全局會話中。

這是我的過濾器的代碼:

< ------ BEGIN CODE ---------------->

class getPrevModuleActionFilter extends sfFilter 
{ 
    public function execute ($filterChain) 
    { 
    //---------------Code to execute *BEFORE THE ACTION* execution---------------  
    if ($this->isFirstCall()) # Execute this filter only once 
    { 
     // Filters don't have direct access to request & user objects => Use context object to get them 
     $request = $this->getContext()->getRequest(); 
     $user = $this->getContext()->getUser(); 

     if($request->getParameter('action') !== "setCulture") 
     {   
     $_SESSION['prev_module'] = "M=".$request->getParameter('module'); 
     $_SESSION['prev_action'] = "A=".$request->getParameter('action'); 
     } 
    } 
    //---------------Execute next filter in the chain--------------- 
    $filterChain->execute(); 

    //---------------Code to execute *AFTER THE ACTION* execution, before the rendering--------------- 
    //(...) 

    } 
} 

< - ---- END CODE ---------------->

奇怪的是,如果我在最後一分鐘在前端Web控制器上執行print_r,我會看到:

  1. 當這不是一個行動「setCulture」一切順利的話(即會話中取得前一個模塊和行動,因爲它應該)

  2. 在行動「setCulture」被執行:在會議之後的Symfony專賣店值:

    Array ( 
        [prev_module] => M= 
        [prev_action] => A=  
        (etc) 
    ) 
    

    即,它丟失了這兩個條目的會話值。

我試過使用不同的命名空間,我嘗試使用sfUser的symfony的setAttribute來處理會話值。最後,我嘗試了PHP的原始會話處理。很顯然,與用戶和會話值存儲相關的工廠關閉方法似乎弄亂了會話值!

我需要你的幫助。

規格:

  • Symfony的版本:1.4.6
  • PHP:5.3
  • 我已經Symfony的緩存禁用
  • 我運行的代碼與frontend_dev.php控制器
+0

不知道我是否正確理解你,但是在哪裏設置了prev_module,並且prev_action是否執行了setCulture? –

+0

你好Tamas :)其實,第一個行動是不是setCulture(這是家/索引),所以我很確定prev_mudule和prev_action得到它們各自的值。然後我請求setCulture動作並且沒有執行任何操作....但是SESSION的值會丟失!有任何想法嗎? (謝謝) –

+1

我現在很確定,從我的測試中,如果在過濾器區域訪問這個數組,symfony會混淆SESSION超全局。如果在動作中進行訪問,則完全相同的代碼可以平穩運行,而不會丟失SESSION值。奇怪的!我嘗試了幾乎所有的東西,甚至在sfSessionStorage.class.php中查找以找到它從SESSION中丟失的值。另一件事,當代碼在過濾器中運行時,我在服務器上檢查了會話中的symfony的php腳本,並且這些變量失去了它們的值,但實際上是在會話中!嗯......我迷路了! –

回答

0

那麼,我猜Symfony在過濾器中使用SESSION和COOKIES時會出現混亂。

我最終創建了自己的篩選器機制,爲整個應用程序執行操作。

因此,要澄清,我的選擇是:

  1. 創建根lib文件夾中自動加載一個類,有一個名爲「fe_app_init」
  2. 添加preExecute方法,每個模塊的動作靜態方法在FE應用程序中使用該類別的fe_app_init

現在,fe_app_init()正確處理SESSION中的值。

Symfony 1這是一個恥辱。4有一個工具,如過濾器,但隨後弄糟SESSION和COOKIES處理。