Magento 2: Was ist die Interceptors-Datei in var / generation?

24

Also habe ich ein paar Interceptor.phpDateien in bemerktvar/generation

Ich weiß, dass dieser Ordner generierte Klassen enthält, die im laufenden Betrieb für Folgendes erstellt wurden:

  • Fabriken
  • Proxies
  • Plugins

Ich gehe davon aus, dass Interceptor-Dateien mit den Plug-In-Dateien verknüpft sind. Manchmal verstehe ich jedoch nicht, wie diese Dateien generiert werden. Zum Beispiel habe ich, var/generation/Magento/Framework/App/Response/Http/Interceptor.phpaber diese Datei scheint keiner vorhandenen Klasse zu entsprechen.

Also ich bin für eine gut suchen erklärt Workflow, wie Interceptor.php Dateien erzeugt werden?

Raphael bei Digital Pianism
quelle

Antworten:

32

Interceptor-Klassen sind eine Implementierung des Interceptor-Entwurfsmusters . Die Interceptors beschreiben, wie das Objektsystem von Magento 2 ein Pluginsystem implementiert .

Als Client-Entwickler müssen Sie sich theoretisch keine Gedanken über Interceptors machen. Sie fragen den Objektmanager nach einem Objekt vom Typ X und er gibt es an Sie zurück. Das Objekt, nach dem Sie gefragt haben, kann ein Interceptor sein oder nicht, aus Sicht des Client-Programmierers verhält es sich jedoch genauso wie die Nicht-Interceptor-Version. Wie der Objektmanager entscheidet, einen Interceptor in einem Implementierungsdetail zurückzugeben oder nicht zurückzugeben.

Für Personen, die an diesem Implementierungsdetail interessiert sind - wenn für eine Klasse oder eine übergeordnete Klasse dieser Klasse ein Plugin konfiguriert ist, gibt der Objektmanager einen Interceptor zurück. Sie können dies in der Entwicklermodus-Interceptor-Klasse hier sehen

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

Für die Produktion (dh im kompilierten Modus) scannt Magento das System im Kompilierungsmodus vor und merkt sich, welche Klassen Plugins benötigen.

Für die eigentliche Generation erledigt Magento dies mit einem PHP-Autoloader. Wenn ein Entwickler eine Klasse instanziiert (oder auf andere Weise ein PHP-Autoload-Ereignis mit einem Klassennamen auslöst (in einem Typhinweis, einer class_existsKlasse usw.) und der composer-basierte Autoloader die Klassendatei nicht findet, wird ein zweiter Autoloader registriert

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

ausgelöst wird. Dieser Autoloader

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

wird (indirekt über die Magento\Framework\Code\GeneratorKlasse) nach bestimmten Namensmustern für die Klasse suchen. Wenn der Klassenname auf endet Interceptor, generiert Magento über die generateClassMethode in dieser Klasse einen Interceptor

vendor/magento/framework/Code/Generator.php

Es gibt noch weitere Klassen / Objekte, die Sie ausfindig machen können Magento\Framework\Code\Generator- aber das belassen wir als Übung für den Leser.

Alan Storm
quelle