Вопрос

Итак, 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 очень хорошо написаны деструкторы, которые очищают память сразу после завершения работы!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top