Как стать автором
Обновить

Magento 2: cookies, registry, session

Время на прочтение3 мин
Количество просмотров8.4K

Иногда при обработке запросов в web-приложениях возникает необходимость в кратковременном сохранении промежуточной информации. Для записи информации в браузер клиента используется механизм cookies, для сохранения данных в пределах одного запроса — реестр, для сохранения данных между запросами — сессии. Под катом — примеры для Magento 2.


Cookies


CookieManagerInterface


class CookieHandler
{
    const COOKIE_REFERRAL = 'referral';
    protected $_cookieManager;

    public function __construct(
        \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager
    ) {
        $this->_cookieManager = $cookieManager;
    }

    public function getCookie()
    {
        $result = $this->_cookieManager->getCookie(self::COOKIE_REFERRAL, 'default value');
        return $result;
    }

    public function setCookie($value)
    {
        // set public cookie (can be accessed by JS)
        $meta = new \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata();
        $meta->setPath('/'); // use meta to define cookie props: domain, duration, security, ...
        $meta->setDurationOneYear();
        $this->_cookieManager->setPublicCookie(self::COOKIE_REFERRAL, $value, $meta);

        // or set HTTP only cookie (is not accessible from JavaScript )
        /** @var \Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata $meta */
        $meta = null; // use meta to define cookie props: domain, duration, security, ...
        $this->_cookieManager->setSensitiveCookie(self::COOKIE_REFERRAL, $value, $meta);
    }
}

Registry


Реестр дает возможность использовать "глобальные переменные" в Magento (хотя сами глобальные переменные не приветствуется современным программистским сообществом). Реестр выбрасывает исключение при попытке записать в него данные с уже существующим ключом (если параметр $graceful = false) или просто игнорирует перезапись (если $graceful = true):


class RegistryHandler
{
    const REG_REFERRAL = 'referral';
    protected $_registry;

    public function __construct(
        \Magento\Framework\Registry $registry
    ) {
        $this->_registry = $registry;
    }

    public function process()
    {
        // save value into the registry
        $value = 'u54321';
        $graceful = true; // don't throw exception if variable with the same name exists
        $this->_registry->register(self::REG_REFERRAL, $value, $graceful);

        // get value from registry
        $registered = $this->_registry->registry(self::REG_REFERRAL);

        // replace value 
        if ($this->_registry->registry(static::REG_REFERRAL)) {
            $this->_registry->unregister(static::REG_REFERRAL);
        }
        $this->_registry->register(static::REG_REFERRAL, $value);
    }
}

Почему-то метода для перезаписи какого-либо значения в реестре Magento не предоставляет, хотя, на мой взгляд, эта функция — логичное продолжение пары "register/unregister".


Session


SessionManagerInterface позволяет записывать и считывать данные в/из хранилища (StorageInterface). Хранилище представляет из себя DataObject, поэтому для сессии работают акцессоры get/set (через "магический" метод __call):


class SessionHandler
{
    protected $_sessionManager;

    public function __construct(
        \Magento\Framework\Session\SessionManagerInterface $sessionManager
    ) {
        $this->_sessionManager = $sessionManager;
    }

    public function process()
    {
        // save variable with name 'referral_code' into the session (using 'magic' methods)
        $this->_sessionManager->setReferralCode('u54321');

        // restore saved value from the session
        $saved = $this->_sessionManager->getReferralCode();
    }
}

В данном примере используется default namespace для сохранения данных, поэтому возникает вероятность пересечения по именам с разработчиками других модулей. Для уменьшения этой вероятности можно использовать префиксы в именах переменных, создавая чудовые имена методов типа setYourCompanyNameReferralCode($data), или использовать собственные имплементации SessionManager'а и связанного с ним SessionStorage'а с отличным от других namespace'ом.


P.S.
Спасибо isxam за дополнения и уточнения.

Теги:
Хабы:
+6
Комментарии4

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн