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. Если вам есть, что сказать по данной теме, не стесняйтесь сделать это в разделе комментирования ниже.