Magento 2: tập tin đánh chặn trong var / thế hệ là gì?


24

Vì vậy, tôi nhận thấy một số Interceptor.phptập tin trongvar/generation

Tôi biết rằng thư mục này chứa các lớp được tạo được tạo nhanh chóng cho các mục sau:

  • Các nhà máy
  • Proxy
  • bổ sung

Tôi giả sử rằng các tệp Interceptor được liên kết với các plugin tuy nhiên đôi khi tôi không hiểu làm thế nào các tệp đó được tạo. Ví dụ tôi đã có var/generation/Magento/Framework/App/Response/Http/Interceptor.phpnhưng tệp này dường như không khớp với bất kỳ lớp hiện có nào.

Vì vậy, tôi đang tìm kiếm một quy trình làm việc được giải thích tốt về cách tạo các tệp Interceptor.php?

Câu trả lời:


32

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_existslớ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\Generatorlớ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 generateClassphươ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.

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.