Спостерігачі подій Magento: Singleton порівняно з моделлю


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, якщо sharedє, falseто клас інстанціюється за допомогою $this->_observerFactory->create() (новий екземпляр).
якщо sharedце правда, він використовується миттєво, використовуючи $this->_observerFactory->get()(синглтон).

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

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


Також бореться з цим. Хоча зовсім не обов’язково використовувати typeатрибут, щоб я зазвичай пропускав його зараз.
Саймон

@Simon Я зазвичай пропускаю його. Жоден typeтег не те саме, що <type>singleton</type>. Тож чому ми робимо спостерігачів одиночними?
Маріус

Це справді гарне питання. Ось чому я це схвалив. Просто хотілося зазначити, що ви також можете пропустити його цілком.
Саймон

Відповіді:


36

Існує лише одна справа використання, де одиночна справа для спостерігачів мала б сенс. Це коли ви спостерігаєте дві події, які залежать одна від одної, і ви хочете щось отримати під час першого, але обробляйте це під час другої події. Тут ви також можете використовувати реєстр, але це було б щось ще більш глобальне, тому одиночна та захищена змінна клас є хорошим рішенням.

Насправді цього майже ніколи не відбувається, але магенто 1 і 2 використовують за замовчуванням спільне = вірно

Ймовірно, причина одиночного за замовчуванням у магенто: мікрооптимізація! Хтось подумав, що це заощадить багато часу, щоб не потрібно створювати об'єкти знову і знову. Це може бути правдою для деяких подій, які викликаються кілька сотень разів під час запиту, можливо, це навіть розумно зробити це за замовчуванням у випадках поганого використання подій.


5
Шви люблять досить хороше пояснення. . І тепер, коли ви це згадали, це вдарило мене по голові ... справжній випадок використання одиночних клавіш: коли ви хочете спостерігати, _save_beforeа _save_afterдії щодо збереження після цього залежать від чогось _save_before. Да! як я міг це пропустити?
Маріус

", тобто, чому magento2 використовує за замовчуванням shared = false" Це неправильно. Magento 2 використовує shared=trueза замовчуванням .
Mage2.PRO


thx, оновив відповідь
Flyingmana

1

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

Наперед magento 2.0 використовує спільні об'єкти для використання .. magento 2.0 має дуже добре написані деструктори, які зберігають пам'ять очищення, як тільки робота виконана!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.