2011-09-02 74 views
1

我有一個通知類用於提供一次性消息通知。該通知被存儲在一個Kohana的會話(餅乾)和我的getter看起來像這樣(回波是有用於調試):Kohana 3中的會話變量在刪除後不斷重置

private static function _get($key) 
{ 
    $session = Session::instance(); 
    $value = $session->get($key); 

    echo $key . ': ' . $session->get($key) . '<br />'; 

    $session->delete($key); 

    echo 'deleted ' .$key. ', value now: ' .$session->get($key). '<br /><br />'; 

    return $value; 
} 

現在,一個頁面我使用這個類上是登錄頁面。當用戶輸入不正確的登錄信息時,它會執行我期望的操作:顯示錯誤,提示「用戶名/密碼不正確」。這條消息應該是已刪除,因爲我調用了getter,並且getter將它從會話中刪除。

但是,情況並非如此。該消息也顯示在下一頁上。如果我轉到顯示通知的任何其他頁面,也會顯示錯誤,直到顯示不同的錯誤(例如,如果我錯誤地在另一個表單上輸入信息)。

這是從回波的頁面上顯示:

error: Username/password combination is incorrect.
deleted error, value now:

這表明價值被刪除,但它仍然顯示,當我刷新頁面同樣的事情。

如果有幫助,這是什麼設置錯誤消息的過程就像是從控制器我打電話Notices::error('message');調用該方法:

public static function error($value = NULL) 
{ 
    return Notices::_notice('error', $value); 
} 

的呼叫:

private static function _notice($key, $value) 
{ 
    // If value is not NULL, then store the notice 
    if (! is_null($value)) 
    { 
     Notices::_set($key, $value); 
     return TRUE; 
    } 
    else 
    { 
     // If value is not NULL. retieve key and format HTML 
     if (! is_null($value = Notices::_get($key))) 
     { 
      return "$value"; 
     } 
     // If the key does not exist return empty string 
     else 
     { 
      return ''; 
     } 
    } 
} 

和setter看起來像這樣:

private static function _set($key, $value) 
{ 
    Session::instance()->set($key, $value); 
    return TRUE; 
} 

回答

2

如果會話設置在y上播放ou,檢查兩件事情:

  1. 你的browser cache is not so aggressive它似乎堅持元素的殘餘,除非你強制刷新它。
  2. 你不是也用相同的方法設置會話,因此當你刷新頁面或再次調用方法時,它會重新填充變量。

您也應該檢查在Kohana_Session類,它的完成後,破壞該變量取出來的$_SESSION變量的現有get_once方法:

/** 
* Get and delete a variable from the session array. 
* 
*  $bar = $session->get_once('bar'); 
* 
* @param string variable name 
* @param mixed default value to return 
* @return mixed 
*/ 
public function get_once($key, $default = NULL) 
{ 
    $value = $this->get($key, $default); 

    unset($this->_data[$key]); 

    return $value; 
}