Хранение данных в сессии
Компонент сессии предоставляет объектно-ориентированные обертки для доступа к данным сессии.
Причины использования этого компонента вместо сырых сессий:
- Вы можете легко изолировать данные сессии между приложениями на одном домене
- Перехватывать, где данные сессии устанавливаются/получаются в вашем приложении
- Изменять адаптер сессии в соответствии с потребностями приложения
Инициализация сессии
Некоторые приложения являются сессионно-ёмкими, практически любое действие, которое выполняется, требует доступа к данным сессии. Есть и другие, которые случайным образом обращаются к данным сессии. Благодаря контейнеру сервисов мы можем гарантировать, что к сессии обращаются только тогда, когда это явно необходимо:
use Phalcon\Session\Adapter\Files as Session;
// Start the session the first time when some component request the session service
$di->setShared(
"session",
function () {
$session = new Session();
$session->start();
return $session;
}
);
Хранение/Извлечение данных в сессии
Из контроллера, представления или любого другого компонента, который расширяет Phalcon\Di\Injectable, вы можете получить доступ к сервису сессии и хранить/извлекать элементы следующим образом:
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");
}
}
}
Удаление/Удаление сессий
Также возможно удалить определённые переменные или уничтожить всю сессию:
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();
}
}
Изоляция данных сессии между приложениями
Иногда пользователь может дважды использовать одно и то же приложение на одном сервере в одной сессии. Конечно, если мы используем переменные в сессии, мы хотим, чтобы каждое приложение имело отдельные данные сессии (даже если код и имена переменных одинаковы). Для решения этой проблемы вы можете добавить префикс к каждой переменной сессии, созданной в определённом приложении:
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;
}
);
Добавление уникального идентификатора не требуется.
Сессионные пакеты
Phalcon\Session\Bag — это компонент, который помогает разделить данные сессии на «пространства имён». Работая таким образом, вы можете легко создавать группы переменных сессии в приложении. Просто установив переменные в «пакете», они автоматически сохраняются в сессии:
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. Этот класс изолирует переменные для каждого класса. Благодаря этому вы можете сохранять данные между запросами в каждом классе независимым образом.
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;
}
}
}
В компоненте:
use Phalcon\Mvc\Controller;
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 доступно больше адаптеров для этого компонента: Phalcon Incubator
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/session.html