Наблюдатели событий Magento:Синглтон против модели
-
12-12-2019 - |
Вопрос
Итак, Magento предлагает два способа объявления наблюдателя.Синглтон и модель (новый экземпляр), указав <type>
тег в Magento 1.x и указав shared
атрибут в Magento 2.
Magento 1 способ сделать это.
<events>
<event_name>
<observers>
<unique_observer_name>
<type>model|object|singleton|null</type>
<class>class/alias_here</class>
<method>methdNameHere</method>
</unique_observer_name>
</observers>
</event_name>
</events>
Версия Магенто 2:
<event name="event_name">
<observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>
Итак, в случае с Magento 1, если <type>
тег является моделью или объектом, экземпляр класса будет создан с помощью Mage::getModel()
.Если это singleton
или он отсутствует, его экземпляр создается с помощью Mage::getSingleton()
.
В случае Magento 2, если shared
является false
затем создается экземпляр класса с использованием $this->_observerFactory->create()
(новый экземпляр).
если shared
правда, он создается с использованием $this->_observerFactory->get()
(синглтон).
Идея наблюдателей событий в двух версиях очень схожа, но большинство наблюдателей в Magento 1 используются как синглтоны, потому что type
тег отсутствует, а в Magento 2 большинство (я думаю, все) наблюдателей имеют shared="false"
.
Я озадачен. Когда мне следует использовать синглтоны, а когда следует использовать новые экземпляры для наблюдателей?
Версия Magento (1 или 2) здесь не важна.
Для каждого подхода подойдет простой вариант использования (новый экземпляр или синглтон).
Решение
Есть только один вариант использования, где синглтон для наблюдателей имел бы смысл.Это когда вы наблюдаете два события, которые зависят друг от друга, и хотите что-то получить во время первого, но обработать это во время второго события.Вы также можете использовать здесь реестр, но это будет нечто еще более глобальное, поэтому синглтон и переменная защищенного класса — хорошее решение.
На самом деле этого почти никогда не происходит, но magento 1 и 2 по умолчанию используютshared=true.
Вероятная причина, почему синглтон используется по умолчанию в magento:микрооптимизация!Кто-то подумал, что это сэкономит ооочень много времени, если не придется создавать объекты снова и снова.Это может быть верно для некоторых событий, которые вызываются несколько сотен раз во время запроса, возможно, даже разумно сделать это по умолчанию в случаях неправильного использования событий.
Другие советы
Magento по умолчанию использует синглтон, поэтому экономит ресурсы внутри коробки.Модель двух параллельных рабочих процессов, поскольку им необходимо хранить и хранить данные индивидуально.в синглтоне объект становится нестабильным, как только загружаются новые данные.
Изначально Magento 2.0 использует общие объекты для использования..В magento 2.0 очень хорошо написаны деструкторы, которые очищают память сразу после завершения работы!