Magento Event Observers: синглтон против модели

45

Таким образом, Magento предлагает 2 способа объявления наблюдателя. Singleton и Model (новый экземпляр), указав <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>

Версия Magento 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, если sharedis, falseто экземпляр класса создается с использованием $this->_observerFactory->create() (новый экземпляр).
Если sharedtrue, то создается с использованием $this->_observerFactory->get()(singleton).

Между двумя версиями идея наблюдателя событий очень похожа, но большинство наблюдателей в Magento 1 используются как синглтоны, потому что typeтег отсутствует, а в Magento 2 большинство (я думаю, что все) наблюдателей имеют shared="false".

Я озадачен Когда я должен использовать синглтоны и когда я должен использовать новые экземпляры для наблюдателей?
Версия Magento (1 или 2) здесь не важна.
Простой вариант использования подойдет для каждого подхода (новый экземпляр или одиночный)

Мариус
источник
Тоже борюсь с этим. Хотя использовать typeатрибут вообще не обязательно , поэтому я обычно его пропускаю.
Саймон
@ Симон, я обычно пропускаю это. Нет typeтега это то же самое, что и <type>singleton</type>. Так в чем же причина того, что мы делаем наблюдателей синглетонами?
Мариус
Это действительно хороший вопрос. Вот почему я проголосовал за это. Просто хотел отметить, что вы также можете пропустить это полностью.
Саймон

Ответы:

36

Существует только один вариант использования, в котором синглтон для наблюдателей будет иметь смысл. Это когда вы наблюдаете два события, которые зависят друг от друга, и вы хотите получить что-то во время первого, но обработать это во время второго события. Вы также можете использовать реестр здесь, но это будет нечто более глобальное, поэтому синглтон и переменная защищенного класса - хорошее решение.

В действительности это почти никогда не происходит, но magento 1 и 2 используют по умолчанию shared = true

Вероятная причина, по которой синглтон по умолчанию используется в magento: микрооптимизация! Кто-то думал, что это сэкономит так много времени, чтобы не создавать объекты снова и снова. Может быть верно для некоторых событий, которые вызываются несколько сотен раз во время запроса, может быть даже разумно сделать это по умолчанию для случаев неправильного использования событий.

Flyingmana
источник
5
Швы вроде достаточно хорошего объяснения. , И теперь, когда вы упомянули об этом, мне пришло в голову ... реальный вариант использования синглетонов: когда вы хотите наблюдать, _save_beforeи _save_afterдействия по сохранению после зависят от чего-то _save_before. Duh! как я мог пропустить это?
Мариус
msgstr "по какой причине magento2 использует по умолчанию shared = false" Это неправильно. Magento 2 использует shared=trueпо умолчанию .
Mage2.PRO
спасибо, обновил ответ
Flyingmana
1

Magento по умолчанию использует синглтон, поэтому он экономит ресурсы внутри коробки. две параллельные модели операционных потребностей процесса, поскольку они должны хранить и хранить данные индивидуально. в синглтоне объект становится изменчивым, как только загружаются новые данные.

Upgenly magento 2.0 использует общие объекты для использования .. magento 2.0 имеет очень хорошо написанные деструкторы, которые продолжают чистить память, как только работа сделана!

Vipul Dadhich -TyLabs
источник