Підступна війна росії проти України. Орієнтовні втрати ворога
(станом на 06.10.2022)
61330
осіб
264
літаків
225
гелікоптерів
2449
танків
5064
ББМ
1424
артилерія
176
ППО
344
РСЗВ
3854
машин
15
кораблі і катери
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. Якщо вам є, що сказати по цій темі, не соромтеся зробити це в розділі коментування нижче.

 

 

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

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