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_exists
klasie 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\Generator
klasę) 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ą generateClass
metody 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.