Những lớp nào là loại Chặn có khả năng đánh chặn / Có khả năng cắm plugin trong Magento 2


17

Ngày: 30 tháng 5 năm 2015 (với bản chất thay đổi của Magento 2).

Magento 2 đã giới thiệu một khái niệm plugin , được triển khai thông qua mô hình đánh chặn .

Điều không rõ ràng từ các tài liệu là - những lớp và đối tượng nào trong Magento là "có thể chặn được"? Đó là, bạn định cấu hình một plugin có XML giống như sau

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

nhưng không rõ lớp nào là hợp lệ ObservedType. Đây bài viết wiki cũ cung cấp một số manh mối khi nó nói

Xin lưu ý rằng tính năng plugin không áp dụng cho - Các lớp được tạo mà không cần tiêm phụ thuộc, nghĩa là được tạo bằng toán tử mới trực tiếp, phương thức -Final, -Final class

bất kỳ đối tượng được tạo ra thông qua tiêm phụ thuộc có sẵn để bị chặn? Có ObservedTypecần phải là gợi ý loại được cung cấp trong một __constructphương thức, hoặc nó (nên nó?) Là một cái gì đó khác?

Chủ yếu là cố gắng để hiểu được những gì có thể và không thể thực hiện được với thiết bị đánh chặn Magento 2 trước khi tôi bắt đầu sử dụng chúng.

Câu trả lời:


10

Mỗi lớp của một mô-đun Magento là xen kẽ.

Như được mô tả trên wiki hiện tại, nó bị giới hạn bởi các phương thức và lớp cuối cùng

Không được xác thực, nhưng Các lớp thư viện (thư mục lib) không (/ nên) không được phép bị chặn.

Tôi nghĩ rằng giới hạn đối tượng được tạo không còn đúng nữa, ít nhất là nếu trình tải tự động được cấu hình đúng. Và không nên quan trọng vì chúng không được tạo khi đang bay, nhưng khi trình tạo được thực thi. (vì vậy đây chỉ là vấn đề, trình tải tự động magento phải là cái đầu tiên)


2
Chúng tôi không có giới hạn cho việc chặn các lớp lib. Ngoài ra, để đối tượng có thể bị chặn, nó phải được tạo bằng ObjectManager (hàm tạo của hàm tạo).
Anton Kril

1
Cần lưu ý rằng các phương thức ma thuật (nhưng được khai báo bằng phpdoc) không thể bị chặn. Tôi nghĩ. Kiểu Varien_Object vẫn tồn tại ở một số nơi.
nevvermind

11

Chúng tôi đang nghiên cứu các chú thích "@api" để chú thích các phương thức được đề xuất sẽ ổn định hơn trên các bản phát hành. Nếu bạn lo lắng về khả năng nâng cấp, ngoài những gì có thể có một plugin được xác định, bạn cũng nên xem xét những gì nên có một plugin được xác định. Chúng tôi không khuyên bạn nên chặn các phương pháp không phải @ api, nhưng đôi khi chúng tôi biết rằng đó có thể là lựa chọn tốt nhất. (Chúng tôi để điều đó theo ý của nhà phát triển.)

Chính thức, bạn có thể chặn các phương thức công khai không phải là cuối cùng. Phương pháp riêng chắc chắn sẽ không làm việc. Từ bộ nhớ, việc chặn hiện đang hoạt động bằng cách tạo một lớp con cháu kế thừa lớp thực (khung tiêm phụ thuộc tạo ra các thể hiện của lớp được tạo khi bạn yêu cầu một thể hiện mới của lớp thực). Vì vậy, bất cứ điều gì sẽ cho phép một lớp con được tạo ra và phương thức ban đầu được ghi đè có thể sẽ hoạt động, nhưng các phương thức công khai được khuyến nghị, cho phép chúng tôi linh hoạt sử dụng một số triển khai thông minh khác trong tương lai (điều này sẽ không bao giờ thành hiện thực nếu không có lý do chính đáng) .


5

Tôi biết điều này đã có câu trả lời, nhưng nó đã có từ 2 năm trước. Có thể một số điều thay đổi trong khi chờ đợi.

Đây là những gì tôi tìm thấy cho đến nay.
Từ các tài liệu chính thức và từ đào sâu vào quá trình đánh chặn.

Tôi sẽ trả lời theo cách khác.
Những gì KHÔNG THỂ bị chặn trong Magento 2.
Từ tài liệu chính thức

  • Các đối tượng được khởi tạo trước Magento \ Framework \ Interception bị bootstraged (không chắc điểm đó ở đâu)
  • Phương pháp cuối cùng
  • Bất kỳ phương thức nào từ các lớp cuối cùng (vì lớp đánh chặn được tạo phải mở rộng lớp gốc)
  • Bất kỳ lớp nào có ít nhất một phương thức công khai cuối cùng
  • Các phương thức không công khai (nó có thể hoạt động cho các phương thức được bảo vệ nhưng đây không phải là "đạo đức" vì nó sẽ đưa các phương thức không công khai ra bên ngoài lớp học)
  • phương pháp tĩnh
  • __xây dựng
  • Các loại ảo

Từ đào xung quanh

  • các phương thức trong các lớp không được khởi tạo thông qua trình quản lý đối tượng. (Ví dụ \Magento\Framework\Phrase)
  • các lớp thực hiện \Magento\Framework\ObjectManager\NoninterceptableInterface. (Ví dụ \Magento\Framework\App\Cache\Proxyvà tất cả các proxy được tạo tự động khá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.