Использование сессии — 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-сообщения — это особый тип данных в сессии, которые устанавливаются один раз во время запроса и доступны только на протяжении следующего запроса, затем они автоматически удаляются. Такой способ хранения информации в сессии наиболее часто используется для реализации сообщений, которые будут отображены пользователю один раз, например — подтверждение об успешной отправке формы.

Leave a Comment