Kohana 3中的会话变量在被删除后保持重置

时间:2011-09-02 08:46:32

标签: php session kohana-3

我有一个通知类,用于提供一次性消息通知。通知存储在Kohana会话(cookie)中,我的getter看起来像这样(回音用于调试目的):

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从会话中删除时,此消息应删除

但事实并非如此。该消息也显示在下一页上。如果我转到显示通知的任何其他页面,也会显示错误,直到显示不同的错误(例如,如果我错误地输入另一个表单上的信息)。

这是从页面上的echo中显示的内容:

  

错误:用户名/密码组合不正确   删除错误,现在值:

这表明值 被删除,但在刷新页面时它仍然显示相同的内容。

如果这有助于设置错误消息的过程如下,从控制器我调用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;
}

1 个答案:

答案 0 :(得分:2)

如果您正在播放会话设置,请检查以下两项内容:

  1. 你的browser cache is not so aggressive,除非你强行冲洗,否则它似乎会抓住元素的残余。
  2. 您还没有使用相同的方法设置会话,因此在刷新页面或再次调用方法时重新填充变量。
  3. 您还应该检查 Kohana_Session 类中现有的get_once方法,该方法在将变量从$_SESSION变量中取出后销毁该变量:

    /**
     * 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;
    }