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