Magento 2: cookies, registry, session

Іноді при обробці запитів в 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
Реестр викидає виключення при спробі записати в нього дані з вже існуючим ключем (якщо параметр $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 name 'referral_code' into the session (using 'magic' methods)
$this->_sessionManager->setReferralCode('u54321');

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.