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