Переменная сеанса в Kohana 3 продолжает сбрасываться после удаления - PullRequest
1 голос
/ 02 сентября 2011

У меня есть класс Уведомления , который используется для одноразовых уведомлений о сообщениях. Уведомления хранятся в сеансе Kohana (cookie), и мой метод получения выглядит следующим образом (эхо есть для целей отладки):

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

Теперь одна страница, на которой я использую этот класс, - это страница входа. Когда пользователь вводит неверную информацию для входа в систему, он делает то, что я ожидаю, тоже: выводит сообщение об ошибке «неправильный логин / пароль». Затем это сообщение должно быть удалено , как я вызвал получатель, а получатель удаляет его из сеанса.

Однако это не так. Сообщение также отображается на следующей странице. И если я перехожу на любую другую страницу, на которой отображаются уведомления, там также будет отображаться ошибка, пока не отобразится другая ошибка (скажем, если я неправильно введу информацию в другую форму).

Это то, что отображается из эхо на странице:

ошибка: неверное сочетание имени пользователя и пароля.
удаленная ошибка, значение сейчас:

Что говорит о том, что значение равно при удалении, но оно все равно показывает то же самое, когда я обновляю страницу.

Если это помогает, то таков процесс установки сообщения об ошибке из контроллера, который я называю 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 '';
        }
    }
}

и сеттер выглядит так:

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

1 Ответ

2 голосов
/ 05 сентября 2011

Если настройки сеанса воспроизводятся на вас, проверьте две вещи:

  1. Ваш кэш браузера не настолько агрессивен , что кажется, что он удерживает остатки элементов, если только выпринудительно очистите его.
  2. Вы также не устанавливаете сеанс в том же методе, поэтому вам нужно будет повторно заполнить переменную при обновлении страницы или повторном вызове метода.

Вам также следует проверить существующий метод get_once в классе Kohana_Session , который уничтожает переменную после того, как она завершена, вынимая ее из переменной $_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;
}
...