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. Якщо вам є, що сказати по цій темі, не соромтеся зробити це в розділі коментування нижче.