Бортовой журнал Ктулху

Сессии в Yii2

Коротко об использовании сессий в 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,
                ],