Magento 2: jakie są pliki przechwytujące w var / generation?

24

Zauważyłem więc kilka Interceptor.phpplikówvar/generation

Wiem, że ten folder zawiera generowane klasy tworzone w locie dla następujących elementów:

  • Fabryki
  • Proxy
  • Wtyczki

Zakładam, że pliki Interceptora są połączone z plikami wtyczek, ale czasami nie rozumiem, w jaki sposób te pliki są generowane. Na przykład mam, var/generation/Magento/Framework/App/Response/Http/Interceptor.phpale ten plik nie pasuje do żadnej istniejącej klasy.

Więc szukam dobrze wyjaśnionego przepływu pracy w jaki sposób generowane są pliki Interceptor.php?

Raphael at Digital Pianism
źródło

Odpowiedzi:

32

Klasy przechwytujące są implementacją wzorca projektowego przechwytującego . Przechwytywacze to sposób, w jaki system obiektowy Magento 2 implementuje system wtyczek .

Jako programista klienta, teoria mówi, że nie musisz się martwić o przechwytywacze - pytasz menedżera obiektów o obiekt typu X, a on zwraca go tobie. Obiekt, o który prosiłeś, może, ale nie musi, być przechwytywaczem, ale z punktu widzenia programisty klienta zachowuje się tak samo, jak wersja nie przechwytująca. Sposób, w jaki menedżer obiektów decyduje się na zwrócenie przechwytywacza w szczegółach implementacji.

Dla osób zainteresowanych szczegółami implementacji - jeśli klasa lub klasa nadrzędna tej klasy ma skonfigurowaną wtyczkę, menedżer obiektów zwraca przechwytywacz. Możesz to zobaczyć w klasie przechwytywacza trybu dewelopera tutaj

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

Do produkcji (tj. W trybie kompilacji) Magento wstępnie skanuje system w trybie kompilacji i zapisuje, które klasy potrzebują wtyczek.

Jeśli chodzi o faktyczną generację, Magento obsługuje to za pomocą autoloadera PHP. Jeśli programista utworzy instancję klasy (lub w inny sposób wyzwoli zdarzenie autoloadowania PHP z nazwą klasy (w podpowiedzi typu, class_existsklasie itp.), A autoloader oparty na kompozytorze nie może znaleźć pliku klasy, drugi zarejestrowany autoloader

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

jest wyzwalany. Ten autoloader

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

będzie (pośrednio przez Magento\Framework\Code\Generatorklasę) skanować w poszukiwaniu klasy w poszukiwaniu określonych wzorców nazewnictwa. Jeśli nazwa klasy kończy się na Interceptor, Magento generuje Interceptor za pomocą generateClassmetody w tej klasie

vendor/magento/framework/Code/Generator.php

Są dodatkowe klasy / obiekty do wyśledzenia z Magento\Framework\Code\Generator- ale zostawimy to jako ćwiczenie dla czytelnika.

Alan Storm
źródło