Сессия позволяет сохранять пользовательские данные между запросами. При использовании чистого PHP можно получить доступ к этим данным через глобальную переменную $_SESSION. Yii2 инкапсулирует сессию в объект, что дает возможность обращаться к пользовательским данным в объектно-ориентированном стиле.
К сессии можно получить доступ через компонент приложения session, который по умолчанию является экземпляром класса yii\web\Session.
Открытие и закрытие сессии
Открыть и закрыть сессию можно следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $session = Yii:: $app ->session; // проверяем, что сессия открыта if ( $session ->isActive) { /*...*/ } // открываем сессию $session ->open(); // закрываем сессию $session ->close(); // уничтожаем сессию и все данные $session ->destroy(); |
Можно вызывать open() и close() многократно без возникновения ошибок — внутри компонента все методы проверяют сессию на предмет того, открыта она или нет.
Доступ к данным сессии
Получить доступ к сохраненным в сессию данным можно следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $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 имеет ограничение, запрещающее прямую модификацию отдельных элементов массива. Например,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $session = Yii:: $app ->session; // следующий код не будет работать $session [ 'captcha' ][ 'number' ] = 5; $session [ 'captcha' ][ 'lifetime' ] = 3600; // а вот этот код — будет работать $session [ 'captcha' ] = [ 'number' => 5, 'lifetime' => 3600, ]; // этот код также будет работать echo $session [ 'captcha' ][ 'lifetime' ]; |
Для решения этой проблемы можно использовать следующие обходные приемы:
1 2 3 4 5 6 7 8 9 10 11 | $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-сообщения — это особый тип данных в сессии, которые устанавливаются один раз во время запроса и доступны только на протяжении следующего запроса, затем они автоматически удаляются. Такой способ хранения информации в сессии наиболее часто используется для реализации сообщений, которые будут отображены пользователю один раз, например — подтверждение об успешной отправке формы.