Magento 2: Plugin vs Observer


27

Trong Magento 2, những ưu và nhược điểm của việc sử dụng plugin so với người quan sát để đạt được điều gì là gì?

Tôi hiểu rằng các nhà quan sát đã đăng ký vào các sự kiện trong khi các plugin có thể nhảy vào trước và / hoặc sau khi một phương thức công khai được gọi trên một lớp Magento, nhưng chắc chắn bây giờ chúng đang tiến rất gần đến đường ngang?


người quan sát sẽ rất hạn chế nhưng plugin bạn thực hiện các thay đổi cho tất cả các chức năng công cộng
Pradeep Kumar

Câu trả lời:


42

Các plugin có mặt khắp nơi vì có thể sửa đổi / thay thế hành vi của bất kỳ phương thức công khai nào trong hệ thống. Các tùy chỉnh nên được thực hiện bằng cách sử dụng bổ trợ cho các phương thức / lớp công khai được đánh dấu bằng @apichú thích (API công khai ổn định) bất cứ khi nào có thể. Cách tiếp cận như vậy đảm bảo rằng tùy chỉnh sẽ duy trì chức năng sau khi phát hành Magento mới. Ngoài before/ afterplugin được đề cập trong câu hỏi, có thể tạo aroundplugin để thay thế hành vi ban đầu.

Mặt khác, các nhà quan sát là cơ chế mở rộng di sản được thừa hưởng từ Magento 1, nó khá hạn chế và nên tránh nếu có thể. Tuy nhiên, không giống như các plugin, chúng có thể cung cấp các điểm mở rộng bên trong các phương thức được bảo vệ / riêng tư.


Ngoài ra hãy xem câu trả lời nói về sở thích so với plugin / quan sát viên: magento.stackexchange.com/a/94035/697 , có thể hữu ích.
Alex Paliarush

@alex: - Làm thế nào để viết plugin cho chức năng được bảo vệ, hầu hết các trường hợp chúng ta cần ghi đè chức năng được bảo vệ trong tình huống đó làm thế nào để làm điều đó? magento.stackexchange.com/questions/91353/ từ
Pradeep Kumar

Các plugin @PradeepKumar chỉ có thể được thêm vào các phương thức công khai. Câu hỏi bạn đề cập có câu trả lời, nhưng giải pháp đề xuất bị chặn nhưng vấn đề đã biết (plugin không thể được áp dụng cho các loại ảo). Như một giải pháp tạm thời, bạn có thể khai báo plugin cho lớp URL khung và có thêm logic điều kiện dựa trên các đối số (để plugin chỉ thực hiện điều gì đó trong trường hợp của bạn)
Alex Paliarush

Tôi đã đưa ra một ví dụ, có rất nhiều chức năng được bảo vệ trong trường hợp đó là cách ghi đè, bất kỳ cách nào tôi có để ghi đè chức năng được bảo vệ
Pradeep Kumar

@PradeepKumar nếu bạn cần ghi đè một phương thức được bảo vệ, bạn có thể cần mở rộng lớp và sử dụng tùy chọn / viết lại. Dù sao, đề nghị bạn đặt câu hỏi cho nó thay vì trong những bình luận này
Robbie Averill

1

Theo hướng dẫn kỹ thuật của Magento ( https://devdocs.magento.com/guides/v2.1/coding-stiterias/technical-guferences.html#14-events ): Tất cả các giá trị (bao gồm cả các đối tượng) được truyền cho một sự kiện KHÔNG PHẢI sửa đổi trong quan sát sự kiện. Thay vào đó, các plugin NÊN được sử dụng để sửa đổi đầu vào hoặc đầu ra của một chức năng.

Đối với tôi, sự khác biệt chính giữa plugin và người quan sát là:

  1. Plugin chỉ có thể sửa đổi các phương thức công khai trong khi các nhà quan sát cũng có thể sửa đổi riêng tư, được bảo vệ.
  2. Có thứ tự sắp xếp cho plugin nhưng không có thứ tự sắp xếp cho người quan sát.
  3. Bạn chỉ có thể thêm người quan sát vào các sự kiện đã được gửi trong Magento. Plugin linh hoạt hơn ở đây.

Tôi cũng có thể cập nhật một đơn đặt hàng với một người quan sát mặc dù phải không?
Robbie Averill

@RobbieAverill có, bạn có thể tạo người quan sát cho checkout_submit_all_aftersự kiện. Người quan sát của bạn sẽ được kích hoạt sau khi đặt hàng thành công.
transversus

Có phải điều đó có nghĩa là họ không sửa đổi dữ liệu không đúng trong trường hợp đó?
Robbie Averill

1
Có bạn đúng @RobbieAverill Cả plugin và người quan sát đều có thể sửa đổi dữ liệu. Đối với tôi, sự khác biệt chính giữa plugin và người quan sát là: 1. Plugin chỉ có thể sửa đổi các phương thức công khai trong khi người quan sát cũng có thể sửa đổi riêng tư, được bảo vệ. 2. Có thứ tự sắp xếp cho plugin nhưng không có thứ tự sắp xếp cho người quan sát. 3. Bạn chỉ có thể thêm người quan sát vào các sự kiện đã được gửi trong Magento. Plugin linh hoạt hơn ở đây.
transversus
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.