Viết lại Magento 2 lớp so với Plugins


17

Magento 2 có khái niệm Plugins / Interception / Interceptors trái ngược với Magento 1.
Những hành động này giống như trước | sau sự kiện cho mọi phương thức công khai. Cái gì là tốt.
Bạn cũng có thể sử dụng aroundplugin để thay thế chức năng của một phương thức.
Nhưng Magento 2 vẫn cung cấp khả năng viết lại các lớp ít nhiều theo cách của M1.
Tôi muốn xem một số ví dụ trong đó việc viết lại các lớp là cách để đi thay vì sử dụng bổ trợ.
Tôi biết điều này hữu ích khi bạn muốn thay đổi hành vi của một phương thức được bảo vệ cốt lõi, nhưng có trường hợp nào khác mà việc viết lại được khuyến nghị hoặc cần thiết không?


Câu trả lời:


19

Lý do rõ ràng để sử dụng viết lại thay vì plugin là khi bạn cần ghi đè một phương thức riêng tư, được bảo vệ hoặc cuối cùng .

Nhưng cũng xem xét các kịch bản sau đây.

Kịch bản thứ 1 (thứ tự sắp xếp tuyệt đối):

Viết lại có thể hữu ích khi bạn cần chạy mã của mình trước các plugin . Tôi biết bạn có thể làm điều đó bằng cách đặt plugin sortOrder, nhưng bạn không thể chắc chắn mã của bạn sẽ luôn là đầu tiên khi ai đó (không phải bạn) sẽ cài đặt các thành phần của bên thứ 3.

Kịch bản thứ 2 (không bao gồm mã):

Nếu bạn cần loại trừ hoặc viết lại chỉ một đoạn mã trong một phương thức, một plugin có thể là một cách tối ưu phụ. Tôi biết bạn có thể sử dụng một aroundplugin và tránh gọi proceed, nhưng điều này có thể phá vỡ các plugin khác trong ngăn xếp.

Kịch bản thứ 3 (kiểu mã):

Bạn nên sử dụng viết lại khi bạn cần viết lại một hành vi, các plugin nên được sử dụng để sửa đổi đầu ra hoặc chạy mã trước / sau.

Một plugin, phải luôn chạy mã gốc để tránh phá vỡ các mô-đun khác.

Kết luận của tôi:

Nếu bạn có thể coi một phương thức cốt lõi là một hộp đen với đầu vào và một đầu ra và bạn không biết gì về các cơ chế bên trong của nó, thì một plugin có thể là lựa chọn tốt nhất.

Nếu bạn cần thay đổi một hành vi nội bộ , viết lại có thể là lựa chọn tốt nhất.


Kịch bản thứ nhất hơi không chính xác (tôi nghĩ đó chỉ là từ ngữ) vì một plugin trước hoặc arround chạy (hoặc có thể chạy) trước mã phương thức thực tế.
David Verholen

Vâng, từ ngữ của tôi là không chính xác. Quan điểm của tôi là về thứ tự sắp xếp tương đối với phương pháp thực tế.
Phoenix128_RiccardoT

7

Câu hỏi tuyệt vời, tôi đã tự hỏi mình điều tương tự vào ngày khác và đây là những gì tôi nghĩ ra:

  • Đầu tiên, các plugin không thể được sử dụng cho các phương thức cuối cùng, các lớp cuối cùng và các lớp được tạo mà không cần tiêm phụ thuộc. Tôi nghĩ đó là một trường hợp rất cụ thể nhưng đó là một trường hợp bạn không thể sử dụng các plugin
  • Thứ hai, bạn cần ghi nhớ định nghĩa của một plugin. Nó được sử dụng để làm việc ở cấp độ phương thức trong khi các tùy chọn được sử dụng để làm việc ở cấp độ toàn lớp. Nó không rõ ràng cho tất cả mọi người vì vậy thật tốt khi ghi nhớ điều đó.
  • Cuối cùng, và tôi cho rằng đó là điều quan trọng nhất, có vẻ như các plugin chỉ có thể được sử dụng để mở rộng hành vi của bất kỳ phương thức công khai nào trong lớp Magento . Do đó, có vẻ như bạn không thể sử dụng plugin với các phương thức được bảo vệ / riêng tư .

Nguồn: Khóa học cơ bản Magento U


2
Đồng ý. Lý do tốt. Tôi không biết phải nói gì về điểm thứ hai. Nếu bạn muốn bổ sung nhiều phương thức công khai từ cùng một lớp, tôi nghĩ cách an toàn nhất là tạo một lớp duy nhất hoạt động như một plugin cho tất cả chúng. (quan điểm của tôi). Tôi sẽ để mở này 2-3 ngày để xem ai đó đưa ra những lý do khác. Nếu không .... dấu kiểm là của bạn.
Marius

@Marius bạn hoàn toàn đúng: điểm thứ hai. Vì một số lý do, tôi nghĩ rằng bạn phải tạo một số tệp plugin cho mọi phương thức bạn muốn bổ sung nhưng tôi nghĩ đó là những gì các nhà quan sát làm, không phải các plugin. Điều đó thật tuyệt nếu nhiều người trả lời để xem liệu có nhiều lý do hơn (không rõ ràng).
Raphael tại Digital Pianism

1
@marius là một bổ sung: vì các Plugin phải là miền cụ thể, tôi nghĩ rằng ít nhất nên thực hành tốt nhất để chỉ xác định nhiều plugin trong một lớp, nếu chúng là một triển khai của cùng một tính năng. Với việc viết lại, bạn không có tùy chọn này vì bạn luôn thay đổi cả lớp. Vì vậy, tôi nghĩ rằng đó sẽ là một lý do để ít nhất cố gắng tránh viết lại
David Verholen

@DavidVerholen. Tôi hoàn toàn đồng ý. Nhưng tôi đã hỏi lý do để sử dụng viết lại thay vì bổ sung.
Marius

vâng tôi nghĩ rằng đây có thể là một lý do để sử dụng plugin vì bạn có thể xác định các lớp plugin cụ thể, trong khi việc viết lại chỉ có thể được thực hiện một lần
David Verholen
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.