Таким образом, 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
is, false
то экземпляр класса создается с использованием $this->_observerFactory->create()
(новый экземпляр).
Если shared
true, то создается с использованием $this->_observerFactory->get()
(singleton).
Между двумя версиями идея наблюдателя событий очень похожа, но большинство наблюдателей в Magento 1 используются как синглтоны, потому что type
тег отсутствует, а в Magento 2 большинство (я думаю, что все) наблюдателей имеют shared="false"
.
Я озадачен Когда я должен использовать синглтоны и когда я должен использовать новые экземпляры для наблюдателей?
Версия Magento (1 или 2) здесь не важна.
Простой вариант использования подойдет для каждого подхода (новый экземпляр или одиночный)
type
атрибут вообще не обязательно , поэтому я обычно его пропускаю.type
тега это то же самое, что и<type>singleton</type>
. Так в чем же причина того, что мы делаем наблюдателей синглетонами?Ответы:
Существует только один вариант использования, в котором синглтон для наблюдателей будет иметь смысл. Это когда вы наблюдаете два события, которые зависят друг от друга, и вы хотите получить что-то во время первого, но обработать это во время второго события. Вы также можете использовать реестр здесь, но это будет нечто более глобальное, поэтому синглтон и переменная защищенного класса - хорошее решение.
В действительности это почти никогда не происходит, но magento 1 и 2 используют по умолчанию shared = true
Вероятная причина, по которой синглтон по умолчанию используется в magento: микрооптимизация! Кто-то думал, что это сэкономит так много времени, чтобы не создавать объекты снова и снова. Может быть верно для некоторых событий, которые вызываются несколько сотен раз во время запроса, может быть даже разумно сделать это по умолчанию для случаев неправильного использования событий.
источник
_save_before
и_save_after
действия по сохранению после зависят от чего-то_save_before
. Duh! как я мог пропустить это?shared=true
по умолчанию .Magento по умолчанию использует синглтон, поэтому он экономит ресурсы внутри коробки. две параллельные модели операционных потребностей процесса, поскольку они должны хранить и хранить данные индивидуально. в синглтоне объект становится изменчивым, как только загружаются новые данные.
Upgenly magento 2.0 использует общие объекты для использования .. magento 2.0 имеет очень хорошо написанные деструкторы, которые продолжают чистить память, как только работа сделана!
источник