Коротко об использовании сессий в Yii2. Такая шпаргалка которая всегда под руками.
В php работа с сессиями происходит через глобальный массив $_SESSION. В Yii 2 есть компонент yii\web\Session, который доступен через Yii::$app->session.
Это как и обычные сессии в PHP но с некоторыми дополнительными возможностями.
При получении данных из сессии через компонент session, сессия будет автоматически открыта, если она не была открыта до этого. В этом заключается отличие от получения данных из глобальной переменной $_SESSION, которое требует обязательного вызова session_start().
Открытие и закрытие сессий
$session = Yii::$app->session;
// проверяем наличие открытой сессии
if ($session->isActive) ...
// открываем сессию
$session->open();
// закрываем сессию
$session->close();
// уничтожаем все данные сессии
$session->destroy();
Многократный вызов методов open() и close() не приводит к ошибкам, так как, эти методы включают внутреннюю проверку на наличие открытой сессии.
Сохранение данных в сессии
$session = Yii::$app->session;
// первый вариант
$session->set('language', 'ru');
// второй вариант
$session['language'] = 'ru';
// третий вариант
$_SESSION['language'] = 'ru';
Получение данных из сессии
$session = Yii::$app->session;
// первый вариант
$language = $session->get('language');
// второй вариант
$language = $session['language'];
// третий вариант
$language = isset($_SESSION['language']) ? $_SESSION['language'] : null;
$session = Yii::$app->session;
// первый вариант
$session->remove('language');
// второй вариант
unset($session['language']);
// третий вариант
unset($_SESSION['language']);
Проверка наличия данных в сессии
// первый вариант
if ($session->has('language')) ...
// второй вариант
if (isset($session['language'])) ...
// третий вариант
if (isset($_SESSION['language'])) ...
Получение всех данных сессии
// первый вариант
foreach ($session as $session_name => $session_value)
echo $session_name.' - '.$session_value;
// второй вариант
foreach ($_SESSION as $session_name => $session_value)
echo $session_name.' - '.$session_value;
Массивы в сессиях
$session = Yii::$app->session;
// первый вариант
$session['user'] = [
'id' => 1,
'username' => 'superuser',
];
// второй вариант
$session['user.id'] = 1;
$session['user.username'] = 'superuser';
// не работоспособный вариант
$session['user']['id'] = 1;
$session['user']['username'] = 'superuser';
// обращение к данным массива
echo $session['user']['id'];
echo $session['user']['username'];
Flash сообщения с использованием сессий
Данный метод позволяет однократно отобразить flash сообщение и удалить данные о нем.
$session = Yii::$app->session;
// устанавливаем значение flash сообщения
$session->setFlash('userinsert', 'Регистрация прошла успешно!');
// проверяем наличие сообщения
$result = $session->hasFlash('userinsert');
// получаем и отображаем сообщение
echo $session->getFlash('userinsert');
Почему может не сохраняться сессия
Для тех кто "асилил" сей баян.
Столкнулся с ситуацией когда сессия не сохраняется. Причиной этого стал глючный memcached, который потребовалось несколько раз перезапустить. В общем, причина была в том, что "потерялся" путь к хранилищу сессии.
И что еще важно, обязательно все должно происходить в пределах одного домена.
Отличия от PHP сессий
Например можно хранить сессии в Redis или Memcached:
'session' => [
'class' => 'yii\redis\Session',
],
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'redis',
'port' => 6379,
'database' => 0,
],