Le classi Interceptor sono un'implementazione del modello di progettazione dell'interceptor . Gli intercettori sono come il sistema a oggetti di Magento 2 implementa un sistema di plugin .
Come sviluppatore client, la teoria è che non devi preoccuparti degli intercettori: chiedi al gestore oggetti un oggetto di tipo X e te lo restituisce. L'oggetto richiesto può essere o meno un intercettore, ma dal punto di vista del programmatore client si comporta come la versione non-intercettore. Come il gestore oggetti decide di restituire o meno un intercettore in un dettaglio di implementazione.
Per le persone interessate a quel dettaglio di implementazione - se una classe, o una classe genitrice di quella classe, ha un plugin configurato, il gestore oggetti restituisce un intercettore. Puoi vederlo nella classe intercettore in modalità sviluppatore qui
#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;
}
Per la produzione (ovvero la modalità compilata), Magento esegue una scansione preliminare del sistema durante la modalità di compilazione e prende nota delle classi che richiedono plug-in.
Per quanto riguarda la generazione attuale, Magento gestisce questo con un caricatore automatico PHP. Se uno sviluppatore crea un'istanza di una classe (o in caso contrario attiva un evento di caricamento automatico PHP con un nome di classe (in un suggerimento di tipo, class_exists
classe, ecc.) E il caricatore automatico basato sul compositore non riesce a trovare il file di classe, un secondo caricatore automatico registrato
Magento\Framework\Code\Generator\Autoloader::load
E 'attivato. Questo caricatore automatico
vendor/magento/framework/Code/Generator/Autoloader.php
cercherà (indirettamente tramite la Magento\Framework\Code\Generator
classe) la ricerca di determinati modelli di denominazione. Se il nome della classe finisce Interceptor
, Magento finisce per generare un Interceptor tramite il generateClass
metodo in questa classe
vendor/magento/framework/Code/Generator.php
Ci sono ulteriori classi / oggetti da rintracciare dal Magento\Framework\Code\Generator
- ma lo lasceremo come esercizio per il lettore.