Người quan sát sự kiện Magento: Singleton vs. Model


45

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 sharedthuộ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ó singletonthiế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 sharedfalsethì 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ì typethẻ 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)


Cũng vật lộn với nó. Mặc dù hoàn toàn không cần thiết phải sử dụng typethuộc tính, vì vậy mà tôi thường bỏ qua nó ngay bây giờ.
Simon

@Simon tôi thường bỏ qua. Không có typethẻ 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ì?
Marius

Đó thực sự là một câu hỏi hay. Đó là lý do tại sao tôi nâng cao nó. Chỉ muốn chỉ ra rằng bạn cũng có thể bỏ qua nó hoàn toàn.
Simon

Câu trả lời:


36

Chỉ có một usecase, trong đó singleton cho các nhà quan sát sẽ có ý nghĩa. Đó là khi bạn quan sát hai sự kiện phụ thuộc lẫn nhau và bạn muốn nhận được một cái gì đó trong sự kiện đầu tiên, nhưng xử lý nó trong sự kiện thứ hai. Bạn cũng có thể sử dụng sổ đăng ký ở đây, nhưng đó sẽ là một cái gì đó toàn cầu hơn, vì vậy singleton và một biến lớp được bảo vệ là một giải pháp tốt.

Trong thực tế, điều này gần như không bao giờ xảy ra, nhưng sử dụng magento 1 và 2 theo mặc định được chia sẻ = true

Lý do có lẽ tại sao singleton được mặc định trong magento: tối ưu hóa vi mô! Ai đó nghĩ rằng nó sẽ tiết kiệm rất nhiều thời gian để không cần phải tạo ra các đối tượng nhiều lần. Có thể đúng với một số sự kiện được gọi là vài trăm lần trong một yêu cầu, có thể là hợp lý nếu làm điều đó như mặc định cho các trường hợp sử dụng sự kiện không tốt.


5
Đường may như một lời giải thích đủ tốt. . Và bây giờ mà bạn đề cập đến nó, nó đánh tôi vào đầu ... một trường hợp sử dụng thực sự cho độc thân: khi bạn muốn quan sát _save_before_save_aftervà những hành động trên tiết kiệm sau khi phụ thuộc vào một cái gì đó từ _save_before. Tât nhiên! Làm thế nào tôi có thể bỏ lỡ nó?
Marius

"đó là lý do tại sao magento2 sử dụng theo mặc định shared = false" Điều này sai. Magento 2 sử dụng shared=truetheo mặc định .
Mage2.PRO


thx, đã cập nhật câu trả lời
Flyingmana

1

Magento theo mặc định sử dụng singleton để tiết kiệm tài nguyên bên trong hộp. hai mô hình nhu cầu vận hành đồng thời khi chúng cần lưu trữ và giữ dữ liệu riêng lẻ. trong singleton, đối tượng sẽ biến động ngay khi dữ liệu mới được tải.

Upfrontly magento 2.0 sử dụng các đối tượng dùng chung để sử dụng .. magento 2.0 có các công cụ hủy diệt được viết rất tốt giúp giữ sạch bộ nhớ ngay khi hoàn thành công việc!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.