08 Сессии
Хранение данных в сессии
Компонент сессии предоставляет объектно-ориентированный интерфейс для работы с сессиями.
Причины использования этого компонента, а не обычных сессий:
- Вы можете легко изолировать сессии данных в различных приложениях на одном домене
- Можно перехватить места установки/получения данных в приложении
- Использование адаптера сессий, оптимального для текущего приложения
Запуск сессии
Некоторые приложения активно используют в своей работе сессии, используя их в каждом действии. Другие наоборот, используют сессии мало и не часто. Благодаря использованию контейнера сервисов, мы можем гарантировать, что запуск сессий будет произведён только по необходимости:
<?php use Phalcon\Session\Adapter\Files as Session; // Сессии запустятся один раз, при первом обращении к объекту $di->setShared( 'session', function () { $session = new Session(); $session->start(); return $session; } );
Фабрика
Загружает адаптер используя параметр adapter
.
<?php use Phalcon\Session\Factory; $options = [ 'uniqueId' => 'my-private-app', 'host' => '127.0.0.1', 'port' => 11211, 'persistent' => true, 'lifetime' => 3600, 'prefix' => 'my_', 'adapter' => 'memcache', ]; $session = Factory::load($options);
Получение и хранение данных в сессии
Из контроллера, представления или любого другого компонента, расширяющего Phalcon\Di\Injectable, можно получить доступ к службе сессий, сохранить элементы и извлечь их следующим образом:
<?php use Phalcon\Mvc\Controller; class UserController extends Controller { public function indexAction() { // Set a session variable $this->session->set('user-name', 'Michael'); } public function welcomeAction() { // Check if the variable is defined if ($this->session->has('user-name')) { // Retrieve its value $name = $this->session->get('user-name'); } } }
Удаление/очистка сессий
Также можно удалить определенные переменные или уничтожить всю сессию:
<?php use Phalcon\Mvc\Controller; class UserController extends Controller { public function removeAction() { // Remove a session variable $this->session->remove('user-name'); } public function logoutAction() { // Destroy the whole session $this->session->destroy(); } }
Изоляция данных сессии между приложениями
Иногда пользователь может использовать одно и то же приложение дважды, на одном сервере, в одном сессии. Конечно, если мы используем переменные в сессии, мы хотим, чтобы каждое приложение имело отдельные данные сессии (даже если тот же код и те же имена переменных). Чтобы решить эту проблему, можно добавить префикс для каждой переменной сессии, созданной в определенном приложении:
<?php use Phalcon\Session\Adapter\Files as Session; // Isolating the session data $di->set( 'session', function () { // All variables created will prefixed with 'my-app-1' $session = new Session( [ 'uniqueId' => 'my-app-1', ] ); $session->start(); return $session; } );
Добавление уникального ID не требуется.
Наборы сессий
Phalcon\Session\Bag - компонент, помогающий разделять данные сессии на пространства имен. Работая таким образом, вы можете легко создавать группы переменных сессии в приложении. Задавая только переменные в пакете, он автоматически сохраняется в сессии :
<?php use Phalcon\Session\Bag as SessionBag; $user = new SessionBag('user'); $user->setDI($di); $user->name = 'Kimbra Johnson'; $user->age = 22;
Сохранение данных в компонентах
Контроллер, компоненты и классы, которые расширяют Phalcon\Di\Injectable, могут ввести Phalcon\Session\Bag. Этот класс изолирует переменные для каждого класса. Благодаря этому вы можете независимо хранить данные между запросами в каждом классе.
<?php use Phalcon\Mvc\Controller; class UserController extends Controller { public function indexAction() { // Create a persistent variable 'name' $this->persistent->name = 'Laura'; } public function welcomeAction() { if (isset($this->persistent->name)) { echo 'Welcome, ', $this->persistent->name; } } }
В компоненте:
<?php use Phalcon\Mvc\User\Component; class Security extends Component { public function auth() { // Create a persistent variable 'name' $this->persistent->name = 'Laura'; } public function getAuthName() { return $this->persistent->name; } }
Данные, добавленные в сеанс ($this->session
) , доступны во всем приложении, в то время как постоянные ($this->persistent
) могут быть доступны только в области текущего класса.
Реализация собственных адаптеров
Интерфейс Phalcon\Session\AdapterInterface должен быть реализован для создания собственных адаптеров сеанса или расширения существующих.
Существует больше адаптеров, доступных для этого компонента в Phalcon Incubator