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

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

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

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

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

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

<?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