Yii2. Использование сессии
12.07.2019
Теги: Session • Web-разработка • Yii2 • Теория • Фреймворк
Сессия позволяет сохранять пользовательские данные между запросами. При использовании чистого PHP можно получить доступ к этим данным через глобальную переменную $_SESSION
. Yii2 инкапсулирует сессию в объект, что дает возможность обращаться к пользовательским данным в объектно-ориентированном стиле.
К сессии можно получить доступ через компонент приложения session
, который по умолчанию является экземпляром класса yii\web\Session
.
Открытие и закрытие сессии
Открыть и закрыть сессию можно следующим образом:
$session = Yii::$app->session; // проверяем, что сессия открыта if ($session->isActive) { /*...*/ } // открываем сессию $session->open(); // закрываем сессию $session->close(); // уничтожаем сессию и все данные $session->destroy();
Можно вызывать open()
и close()
многократно без возникновения ошибок — внутри компонента все методы проверяют сессию на предмет того, открыта она или нет.
Доступ к данным сессии
Получить доступ к сохраненным в сессию данным можно следующим образом:
$session = Yii::$app->session; // Получение переменной из сессии. Следующие способы использования эквивалентны: $language = $session->get('language'); $language = $session['language']; $language = isset($_SESSION['language']) ? $_SESSION['language'] : null; // Запись переменной в сессию. Следующие способы использования эквивалентны: $session->set('language', 'en-US'); $session['language'] = 'en-US'; $_SESSION['language'] = 'en-US'; // Удаление переменной из сессии. Следующие способы использования эквивалентны: $session->remove('language'); unset($session['language']); unset($_SESSION['language']); // Проверка на существование переменной в сессии. Следующие способы использования эквивалентны: if ($session->has('language')) { /*...*/ } if (isset($session['language'])) { /*...*/ } if (isset($_SESSION['language'])) { /*...*/ } // Обход всех переменных в сессии. Следующие способы использования эквивалентны: foreach ($session as $name => $value) { /*...*/ } foreach ($_SESSION as $name => $value) { /*...*/ }
session
, сессия будет автоматически открыта, если она не была открыта до этого. В этом заключается отличие от получения данных из глобальной переменной $_SESSION
, которое требует обязательного вызова session_start()
.
При работе с сессионными данными, являющимися массивами, компонент session
имеет ограничение, запрещающее прямую модификацию отдельных элементов массива. Например,
$session = Yii::$app->session; // следующий код не будет работать $session['captcha']['number'] = 5; $session['captcha']['lifetime'] = 3600; // а вот этот код — будет работать $session['captcha'] = [ 'number' => 5, 'lifetime' => 3600, ]; // этот код также будет работать echo $session['captcha']['lifetime'];
Для решения этой проблемы можно использовать следующие обходные приемы:
$session = Yii::$app->session; // прямое использование $_SESSION — только после вызова Yii::$app->session->open() $_SESSION['captcha']['number'] = 5; $_SESSION['captcha']['lifetime'] = 3600; // получаем массив целиком, модифицируем и сохраняем обратно в сессию $captcha = $session['captcha']; $captcha['number'] = 5; $captcha['lifetime'] = 3600; $session['captcha'] = $captcha;
Flash-сообщения
Flash-сообщения — это особый тип данных в сессии, которые устанавливаются один раз во время запроса и доступны только на протяжении следующего запроса, затем они автоматически удаляются. Такой способ хранения информации в сессии наиболее часто используется для реализации сообщений, которые будут отображены пользователю один раз, например — подтверждение об успешной отправке формы.
Дополнительно
Поиск: Web-разработка • Yii2 • Теория • Фреймворк • Session • Сессия • Flash