Yii2. Использование сессии

12.07.2019

Теги: SessionWeb-разработка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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.