Magento 2:Können Sie ein Plugin mit dem Typ „Psr\Log\LoggerInterface“ verwenden?
-
13-12-2019 - |
Frage
Ich habe eine di.xml, die ungefähr so aussieht
<config>
<type name="Psr\Log\LoggerInterface">
<plugin name="namespace_modulename_plugins_psr"
type="Namespace\Modulename\Plugins\Psr"
sortOrder="10"
disabled="false"/>
</type>
</config>
Der Namespace\Modulename\Plugins\Psr
Klasse kann instanziiert werden und verfügt über eine beforeInfo
Methode definiert
public function beforeInfo($subject)
{
var_dump(__METHOD__);
exit;
}
Wenn ich jedoch einen Logger injiziere und versuche, ihn zu verwenden
/* @var $psr `Psr\Log\LoggerInterface` */
$psr->info("This is a message");
Die Nachricht wird erfolgreich protokolliert, aber das System ruft meine Plugin-Methode nicht auf.
Gibt es etwas Besonderes an der? Psr\Log\LoggerInterface
das macht es nicht-pluginfähig?Wenn nicht, verfügt jemand über eine solide Methode zum Debuggen von Plugin-Konfigurationsproblemen?
Lösung 2
Nach ein wenig Recherche stellt sich heraus, dass Psr\Log\LoggerInterface
(und der zugrunde liegende Beton Monolog
Implementierungsklasse) dürfen eingesteckt werden.Das Problem bestand darin, dass Sie eine vollständige Di-Kompilierung durchführen müssen, wenn Sie den Entwicklermodus aktiviert haben (siehe diesen Fehler).Läuft
php bin/magento setup:di:compile
Die Interceptoren sollten generiert werden und die Plugins funktionieren.
Andere Tipps
PSR\Log\LoggerInterface
befindet sich nicht im Magento-Modul- oder Framework-Ordner.Es wird also nicht vom Compiler analysiert und nicht im Produktionsmodus eingebunden.Wenn Sie das Verhalten von Klassen von Drittanbietern per Plugin anpassen/konfigurieren möchten, sollten Sie einen Adapter verwenden.