Использование сессий — это хороший способ сохранять информацию между визитами пользователя на сайт. Изначально, в php, работа с сессиями ведется через глобальный массив $_SESSION. Для удобства работы, экземпляр приложения yii2 содержит компонент yii\web\Session, доступный через Yii::$app->session.
Открытие и закрытие сессий
Простой код, иллюстрирующий работу с сессиями.
$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');
Здравствуйте, а в чем преимущество применения этих методов по сравнению с работой с обычными сессиями? Там есть какая-то фильтрация или что?
Добрый день. Принципиальных отличий нет. Подробности реализации можно увидеть в коде класса yii\web\Session.
Принципиальное различие в том, что в Yii2 можно легко заменить хранилище сессий. Допустим, если мне больше хочется использовать Redis или базу данных, чтобы снизить чтение-запись жесткого диска. В Yii2 это сделать гораздо проще, учитывая, что для этого есть специальный интерфейс.
Отличий в результате работы нет, отличие в удобвстве использования, yii2 даёт вам возможность юзать сессии и куки в ООП режиме, а не копаться в массивах, что значительно удобнее. Кроме того вы можете цепляя различные компоненты хранить куки в разных местах, будто просто таблица в БД, редис или mondoDB, код менять не придётся, просто цепляете нужный компонент и всё. Вот тут хорошо написано об этом: http://nix-tips.ru/yii2-api-guides/guide-ru-runtime-sessions-cookies.html
Получение всех данных сессии — получит массив __array и вызовет ошибку на echo
(проверено — именно так)
*** массив __flash