Magento 2: registry (реєстр)

Magento 2: registry (реєстр)



Досить часто при розробці модуля на Мадженто 2 потрібно використовувати короткочасну інформацію. Наприклад, щоб записувати проміжні дані в браузер клієнта, ми використовуємо куки (cookies), щоб зберігати дані в межах одного запиту – реєстр (registry), а щоб зберігати дані між запитами – сесії (sessions).

Сьогоднішня стаття присвячена розгляду об’єктів реєстру (registry) в Magento 2. Розглянемо, що таке реєстр (registry) в Magento 2, а також невеликі приклади його використання.

 

 

Registry (реєстр) в Magento 2

Реєстр призначений для зберігання даних, специфічних для цього запиту (а не користувача, або чогось ще), в пам’яті, і ці дані зберігаються лише на час даного запиту.

Реєстр дає можливість використовувати “глобальні змінні” в Magento. Реєстр викидає виключення при спробі записати в нього дані з уже існуючим ключем (або просто ігнорує перезапис).

У Мадженто версій 1.х використовувався дуже простий принцип: клас Mage створюється як singleton (одиночний) об’єкт для кожного запиту, а екземпляр об’єкта Mage залишається в пам’яті та доступний у всіх класах (і шаблонах) до тих пір, поки запит не завершиться і не буде відправлена відповідь.

Оскільки об’єкт є singleton (одинаком), всякий раз, коли ви звертаєтеся до нього, ви отримуєте один і той же об’єкт. Ви зберігаєте значення для цього об’єкта, тому, коли один клас зберігає значення, а інший звертається до нього, вони обидва працюють над одним і тим же об’єктом.

В Magento 1 ми використовували для роботи Mage::register() і Mage::registry(). Але в платформі Magento2 були внесені зміни в цю реалізацію. У новій версії платформи нам потрібно використовувати клас \Magento\Framework\Registry, який приймає налаштування і реєстр даних, і який ми можемо включати в будь-який конструктор.



 

Приклад включення реєстру в конструктор:

namespace SebWeo\Hello\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
  protected $_registry;
  public function __construct(
    …,
    \Magento\Framework\Registry $registry
  ) {
     $this->_registry = $registry;
     …
 }
 …

}

 

 

Приклад встановлення і отримання власної змінної в реєстрі:

…
/* Встановлення користувацької змінної для використання в реєстрі */
public function setCustomVariable()
{
  $this->_registry->register('some_var', 'Значення змінної');
}

/*
* Отримання користувальницької змінної з реєстру
* @return string
*/
public function getCustomVariable()
{
  return $this->_registry->registry('some_var');
}
…

 

 

Щоб отримати доступ до змінної, використовується наступний формат коду:

$this->_registry->registry('some_var');

 

 

Як отримувати глобальні об’єкти реєстру Magento 2

Використовуючи приклад з попереднього розділу, ми можемо встановити змінну в реєстрі в контролері, блоці і отримати доступ до неї в будь-якому місці, наприклад, з помічника (helper), в блоці, моделі і т.д., але тільки в тому ж запиті.

Важливо. Якщо ми будемо звертатися до реєстру з класу, нам потрібно буде знову включати клас \Magento\Framework\Registry в конструктор цього класу.

Подібним чином ми можемо витягувати глобальні об’єкти реєстру Magento 2, такі як поточний товар, категорія, CMS сторінка, CMS блок і т.д. Вам просто потрібно слідувати нижченаведеному фрагменту коду, щоб працювати з об’єктами реєстру в Magento 2:

 

…
/**
* @return \Magento\Catalog\Model\Product
*/
public function getProduct()
{
  return $this->_registry->registry('current_product');
}

/**
* @return \Magento\Catalog\Model\Category
*/
public function getCurrentCategory()
{
  return $this->_registry->registry('current_category');
}
…

 

 

Сподіваємося, що за допомогою сьогоднішньої статті ви дізналися більше про реєстр в Magento 2. Якщо вам є, що сказати по цій темі, не соромтеся зробити це в розділі коментування нижче.

 



Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *