Các lớp đánh chặn là một triển khai của mẫu thiết kế đánh chặn . Các phần mềm chặn là cách hệ thống đối tượng của Magento 2 thực hiện một hệ thống plugin .
Là một nhà phát triển ứng dụng khách, lý thuyết là bạn không cần phải lo lắng về việc chặn - bạn yêu cầu người quản lý đối tượng cho một đối tượng loại X và nó sẽ trả lại cho bạn. Đối tượng bạn yêu cầu có thể hoặc không thể là một kẻ đánh chặn, nhưng theo quan điểm của lập trình viên máy khách, nó hoạt động giống như phiên bản không chặn. Làm thế nào người quản lý đối tượng quyết định trả lại hoặc không trả lại một thiết bị chặn trong một chi tiết thực hiện.
Đối với những người quan tâm đến chi tiết triển khai đó - nếu một lớp hoặc một lớp cha của lớp đó, có một plugin được cấu hình, trình quản lý đối tượng trả về một bộ chặn. Bạn có thể thấy rằng trong lớp đánh chặn chế độ nhà phát triển ở đây
#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
$type = parent::getInstanceType($instanceName);
if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
&& $this->interceptableValidator->validate($instanceName)
) {
return $type . '\\Interceptor';
}
return $type;
}
Để sản xuất (tức là chế độ biên dịch), Magento quét trước hệ thống trong chế độ biên dịch và ghi chú những lớp nào cần plugin.
Đối với thế hệ thực tế, Magento xử lý việc này với trình tải tự động PHP. Nếu nhà phát triển khởi tạo một lớp (hoặc nói cách khác là kích hoạt sự kiện tự động tải PHP bằng tên lớp (trong một gợi ý loại, class_exists
lớp, v.v.) và trình tải tự động dựa trên trình soạn thảo không thể tìm thấy tệp lớp, trình tải tự động đã đăng ký thứ hai
Magento\Framework\Code\Generator\Autoloader::load
được kích hoạt. Trình tải tự động này
vendor/magento/framework/Code/Generator/Autoloader.php
sẽ (gián tiếp thông qua Magento\Framework\Code\Generator
lớp) quét lớp để tìm các mẫu đặt tên nhất định. Nếu tên lớp kết thúc Interceptor
, Magento sẽ tạo ra một Thiết bị chặn thông qua generateClass
phương thức trong lớp này
vendor/magento/framework/Code/Generator.php
Có các lớp / đối tượng bổ sung để tìm ra từ Magento\Framework\Code\Generator
- nhưng chúng tôi sẽ để nó như một bài tập cho người đọc.