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