Wie kann ich einen Controller (das ist eigentlich eine Aktion) in Magento 2 umschreiben?
Ich habe versucht, wie hier so angewiesen :
Ich habe mein eigenes Modul Namespace_Module
mit einer di.xml
Datei aufgerufen , die berücksichtigt wird, da das gleiche System an Modellen und Blöcken arbeitet.
Beispiel:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<!-- this one doesn't work for a controller action -->
<preference for="Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics"
type="Namespace\Module\Controller\Adminhtml\Dashboard\RefreshStatistics" />
<!-- this one works for a model -->
<preference for="Magento\Customer\Model\Resource\GroupRepository"
type="Namespace\Module\Model\Resource\Customer\GroupRepository" />
<!-- this one works also for a block -->
<preference for="Magento\Backend\Block\Dashboard"
type="Namespace\Module\Block\Backend\Dashboard" />
</config>
Ich versuche, die Dashboard-Aktualisierungsstatistik durch meine eigene Aktion zu ersetzen. Wenn Sie wie oben vorgehen, wird die execute
Methode in der ursprünglichen Klasse immer noch aufgerufen und nicht meine eigene.
var/cache
und var/generation
wurden gelöscht.
Antworten:
Fand es.
Eigentlich ist das, was ich in der Frage gepostet habe, die richtige Art, einen Controller neu zu schreiben.
funktioniert gut.
Das Problem für mich war das. Ich habe vergessen zu erwähnen, dass ich einige Module von Magento2 entfernt habe und darunter das
Reports
Modul. Ich habe es in der Frage nicht angegeben, weil ich es nicht für bedeutend hielt.Die obige Methode zum Umschreiben von Controllern (und möglicherweise anderen Klassen) funktioniert, wenn alle Klassen, die Sie ändern möchten, vorhanden sind und auch alle übergeordneten Klassen.
So ist die ursprüngliche
Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
erstreckt ,Magento\Reports\Controller\Adminhtml\Report\Statistics
dass ich entfernt hatte.In Magento 2 werden die Routen gesammelt, indem die Ordner
Controller
nach allen aktivierten Modulen durchsucht und in einem Array zusammengefasst werden.So weit, ist es gut.
Ich lande mit dieser Zeile unter anderem:
Dann wird die Anfrage mit der Route abgeglichen
magento\backend\controller\adminhtml\dashboard\refreshstatistics
und Magento prüft, ob die Klasse, die dieser Route entspricht, eine Unterklasse von istMagento\Framework\App\ActionInterface
. Da die Routen gesammelt werden, bevor meine Klasse identifiziert und instanziiert werden soll, wird die alte Klasse anstelle meiner eigenen validiert. Und die Elternklasse der KlasseMagento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
existiert nicht.Eine Lösung, um das Berichtsmodul zu deaktivieren, aber dennoch funktionsfähig zu halten, besteht darin, einen Interceptor für die Methode zu erstellen, der alle Routen liest und die oben genannte Route ersetzt.
Also habe ich dies hinzugefügt
di.xml
und mein Plugin sieht so aus:
quelle
Verwenden Sie das Plugin nicht, um ein Core-Modul in der Datei di.xml zu erweitern
und in Product.php
So überschreiben Sie Core Block, Model und Controller in Magento2
quelle
around
würde für mich nicht. Ich wollte das Verhalten des ursprünglichen Controllers komplett ändern.Ich habe Controller für Testmodell umgeschrieben. composer.json Datei:
registration.php Datei
app / code / Apple / Review / etc / module.xml Datei:
In der Controller-Datei für das Überprüfungsmodell
App / Code / Apple / Überprüfung / Controller / Post.php
Dies ist der Arbeitscode für das Überschreiben von Überprüfungscontrollern in Magento2. Vielen Dank.
quelle