Досить часто при розробці модуля на Мадженто 2 потрібно використовувати короткочасну інформацію. Наприклад, щоб записувати проміжні дані в браузер клієнта, ми використовуємо куки (cookies), щоб зберігати дані в межах одного запиту – реєстр (registry), а щоб зберігати дані між запитами – сесії (sessions).
Сьогоднішня стаття присвячена розгляду об’єктів реєстру (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');
Використовуючи приклад з попереднього розділу, ми можемо встановити змінну в реєстрі в контролері, блоці і отримати доступ до неї в будь-якому місці, наприклад, з помічника (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. Якщо вам є, що сказати по цій темі, не соромтеся зробити це в розділі коментування нижче.
WordPress роками був неперевершеним "монолітом": він відповідав і за зручну адмін-панель, і за збереження даних,…
У світі веб-серверів часто говорять про протистояння Nginx vs Apache. Але що, якби я сказав…
Коли я починав свій шлях у веб-розробці, питання "який веб-сервер використовувати?" практично не стояло. Відповідь…
Коли мова заходить про веб-сервери, два імені завжди на слуху: Apache та Nginx. Apache —…
У світі веб-розробки ми постійно стикаємося з проблемою: "А в мене на комп'ютері все працює!".…
На зорі моєї кар'єри веб-розробника все було відносно просто: встановив локальний сервер (пам'ятаєте Denwer?), поклав…