Хранение данных в сессии

Компонент сессии предоставляет объектно-ориентированный интерфейс для работы с сессиями.

Причины использования этого компонента, а не обычных сессий:

  • Вы можете легко изолировать сессии данных в различных приложениях на одном домене
  • Можно перехватить места установки/получения данных в приложении
  • Использование адаптера сессий, оптимального для текущего приложения

Запуск сессии

Некоторые приложения активно используют в своей работе сессии, используя их в каждом действии. Другие наоборот, используют сессии мало и не часто. Благодаря использованию контейнера сервисов, мы можем гарантировать, что запуск сессий будет произведён только по необходимости:

<?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);
$session->start();

Получение и хранение данных в сессии

From a controller, a view or any other component that extends Phalcon\Di\Injectable you can access the session service and store items and retrieve them in the following way:

<?php

use Phalcon\Mvc\Controller;

class UserController extends Controller
{
    public function indexAction()
    {
        // Установка значения сессии
        $this->session->set('user-name', 'Michael');
    }

    public function welcomeAction()
    {
        // Проверка наличия переменной сессии
        if ($this->session->has('user-name')) {
            // Получение значения
            $name = $this->session->get('user-name');
        }
    }

}

Удаление/очистка сессий

Таким же способом можно удалить переменную сессии, или целиком очистить сессию:

<?php

use Phalcon\Mvc\Controller;

class UserController extends Controller
{
    public function removeAction()
    {
        // Удаление переменной сессии
        $this->session->remove('user-name');
    }

    public function logoutAction()
    {
        // Полная очистка сессии
        $this->session->destroy();
    }
}

Изоляция данных сеанса между приложениями

Иногда пользователь может запускать одно и тоже приложение несколько раз, на одном и том же сервере, в одно время. Естественно, используя переменные сессий нам бы хотелось, чтобы все приложения получали доступ к разным сессиям (хотя в одинаковых приложениях и код одинаковый и названия переменных). Для решения этой проблемы можно использовать префикс для переменных сессий, разный для разных приложений:

<?php

use Phalcon\Session\Adapter\Files as Session;

// Изоляция данных сессий
$di->set(
    'session',
    function () {
        // Все переменные этого приложения будет иметь префикс "my-app-1"
        $session = new Session(
            [
                'uniqueId' => 'my-app-1',
            ]
        );

        $session->start();

        return $session;
    }
);

Добавлять префикс вручную во время установки или чтения сессий не обязательно.

Наборы сессий

Phalcon\Session\Bag is a component that helps separating session data into namespaces. Работая таким образом, вы можете легко создавать группы переменных сессии в приложении. Установив значение переменной в сессионном объекте, это значение автоматически сохранится в сессии:

<?php

use Phalcon\Session\Bag as SessionBag;

$user = new SessionBag('user');

$user->setDI($di);

$user->name = 'Kimbra Johnson';
$user->age  = 22;

Сохранение данных в компонентах

Controller, components and classes that extends Phalcon\Di\Injectable may inject a Phalcon\Session\Bag. Компонент в таком случае изолирует данные для каждого класса. Благодаря этому вы можете сохранять данные между запросами, используя их как обычные переменные.

<?php

use Phalcon\Mvc\Controller;

class UserController extends Controller
{
    public function indexAction()
    {
        // Создаётся постоянная (persistent) переменная "name"
        $this->persistent->name = 'Laura';
    }

    public function welcomeAction()
    {
        if (isset($this->persistent->name)) {
            echo 'Привет, ', $this->persistent->name;
        }
    }
}

И в компоненте:

<?php

use Phalcon\Mvc\User\Component;

class Security extends Component
{
    public function auth()
    {
        // Создаётся постоянная (persistent) переменная "name"
        $this->persistent->name = 'Laura';
    }

    public function getAuthName()
    {
        return $this->persistent->name;
    }
}

Данные, добавленные непосредственно в сессию ($this->session) доступны во всём приложении, в то время как persistent ($this->persistent) переменные доступны только внутри своего текущего класса.

Реализация собственных адаптеров

The Phalcon\Session\AdapterInterface interface must be implemented in order to create your own session adapters or extend the existing ones.

Существует еще несколько типов адаптеров для работы с сессиями. Их можно получить в “Инкубаторе” — Phalcon Incubator.