Magento 2: apa file Interceptors dalam var / generation?

24

Jadi saya perhatikan beberapa Interceptor.phpfile masukvar/generation

Saya tahu bahwa folder ini berisi kelas yang dibuat yang dibuat dengan cepat untuk yang berikut:

  • Pabrik
  • Proksi
  • Plugin

Saya berasumsi bahwa file Interceptor ditautkan ke plugin tetapi terkadang saya tidak mengerti bagaimana file tersebut dihasilkan. Misalnya saya punya var/generation/Magento/Framework/App/Response/Http/Interceptor.phptapi file ini sepertinya tidak cocok dengan kelas yang ada.

Jadi saya sedang mencari alur kerja yang menjelaskan tentang bagaimana file Interceptor.php dihasilkan?

Raphael di Digital Pianism
sumber

Jawaban:

32

Kelas interceptor adalah implementasi dari pola desain interceptor . Pencegat adalah bagaimana cara sistem objek Magento 2 mengimplementasikan sistem plugin .

Sebagai pengembang klien, teorinya adalah Anda tidak perlu khawatir tentang pencegat - Anda meminta objek manager tipe objek X, dan mengembalikannya kepada Anda. Objek yang Anda minta mungkin atau mungkin bukan pencegat, tetapi dari sudut pandang pemrogram klien berperilaku sama dengan versi non-pencegat. Bagaimana manajer objek memutuskan untuk kembali atau tidak mengembalikan interseptor dalam detail implementasi.

Untuk orang yang tertarik pada detail implementasi - jika kelas, atau kelas induk dari kelas itu, memiliki plugin yang dikonfigurasi, manajer objek mengembalikan interseptor. Anda dapat melihatnya di kelas interceptor mode pengembang di sini

#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;
}

Untuk produksi (yaitu mode terkompilasi), Magento melakukan pra-scan sistem selama mode kompilasi, dan membuat catatan kelas mana yang membutuhkan plugin.

Adapun generasi yang sebenarnya, Magento menangani ini dengan autoloader PHP. Jika pengembang membuat instance kelas (atau memicu acara pengisian-otomatis PHP dengan nama kelas (dalam petunjuk jenis, class_existskelas, dll.), Dan autoloader berbasis komposer tidak dapat menemukan file kelas, autoloader kedua yang terdaftar

Magento\Framework\Code\Generator\Autoloader::load

dipicu. Autoloader ini

vendor/magento/framework/Code/Generator/Autoloader.php

akan (secara tidak langsung melalui Magento\Framework\Code\Generatorkelas) memindai kelas untuk pola penamaan tertentu. Jika nama kelas berakhir Interceptor, Magento akhirnya menghasilkan Interceptor melalui generateClassmetode di kelas ini

vendor/magento/framework/Code/Generator.php

Ada kelas / objek tambahan untuk dilacak dari Magento\Framework\Code\Generator- tapi kami akan meninggalkannya sebagai latihan untuk pembaca.

Alan Storm
sumber