Vì vậy, Magento cung cấp 2 cách tuyên bố một người quan sát. Singleton và Model (ví dụ mới) bằng cách chỉ định <type>
thẻ trong Magento 1.x và bằng cách chỉ định shared
thuộc tính trong Magento 2.
Magento 1 cách làm.
<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>
Phiên bản Magento 2:
<event name="event_name">
<observer name="unique_observer_name" instance="Class\Name\Here" method="methodNameHere" shared="true|false" />
</event>
Vì vậy, trong trường hợp của Magento 1, nếu <type>
thẻ là mô hình hoặc đối tượng, lớp sẽ được khởi tạo với Mage::getModel()
. Nếu nó singleton
thiếu hoặc nó bị thiếu ngay lập tức Mage::getSingleton()
.
Trong trường hợp của Magento 2, nếu shared
là false
thì lớp được khởi tạo bằng cách sử dụng $this->_observerFactory->create()
(ví dụ mới).
nếu shared
đúng thì nó được khởi tạo bằng cách sử dụng $this->_observerFactory->get()
(singleton).
Giữa hai phiên bản, ý tưởng của người quan sát sự kiện rất giống nhau, nhưng hầu hết những người quan sát trong Magento 1 đều được sử dụng như những người độc thân, vì type
thẻ bị thiếu và trong Magento 2 hầu hết (tôi nghĩ tất cả) những người quan sát đều có shared="false"
.
Tôi hoang mang. Khi nào tôi nên sử dụng singletons và khi nào tôi nên sử dụng phiên bản mới cho người quan sát?
Phiên bản Magento (1 hoặc 2) không quan trọng ở đây.
Một trường hợp sử dụng đơn giản sẽ làm cho mỗi cách tiếp cận (ví dụ mới hoặc singleton)
type
thẻ là điều tương tự như <type>singleton</type>
. Vì vậy, lý do chúng ta đang làm cho các nhà quan sát singletons là gì?
type
thuộc tính, vì vậy mà tôi thường bỏ qua nó ngay bây giờ.