jak mogę przepisać kontroler (to właściwie akcja) w Magento 2?
Próbowałem, zgodnie z instrukcją tutaj :
Mam własny moduł wywoływany Namespace_Module
z di.xml
plikiem, który jest brany pod uwagę, ponieważ ten sam system działa na modelach i blokach.
Przykład:
<?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>
Próbuję zastąpić statystyki odświeżania deski rozdzielczej własną akcją. Robiąc to tak jak powyżej, execute
metoda w oryginalnej klasie wciąż jest wywoływana, a nie moja.
var/cache
i var/generation
zostały oczyszczone.
Odpowiedzi:
Znaleziono to.
Właściwie to, co napisałem w pytaniu, to poprawny sposób przepisania kontrolera.
działa ładnie.
Problem był dla mnie taki. Zapomniałem wspomnieć, że usunąłem niektóre moduły Magento2, a wśród nich był to
Reports
moduł. Nie podałem tego w pytaniu, ponieważ nie sądziłem, że to miało znaczenie.Powyższa metoda przepisywania kontrolerów (i być może innych klas) działa, jeśli istnieją wszystkie klasy, które próbujesz zmienić, i wszystkie ich klasy nadrzędne.
Tak więc oryginał
Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
rozciąga sięMagento\Reports\Controller\Adminhtml\Report\Statistics
, który usunąłem.W magento 2 trasy są zbierane przez skanowanie folderów
Controller
folderów w poszukiwaniu wszystkich włączonych modułów i są gromadzone w tablicy.Jak na razie dobrze.
Skończyłem z tą linią między innymi:
Następnie żądanie jest dopasowane do trasy,
magento\backend\controller\adminhtml\dashboard\refreshstatistics
a Magento sprawdza, czy klasa odpowiadająca tej trasie jest podklasąMagento\Framework\App\ActionInterface
. Ponieważ trasy są zbierane, zanim moja klasa powinna zostać zidentyfikowana i utworzona instancja, stara klasa jest sprawdzana zamiast mojej własnej. A klasa nadrzędna tej klasyMagento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
nie istnieje.Rozwiązaniem, które pozwala wyłączyć moduł raportów, ale nadal działa, jest utworzenie przechwytywacza dla metody, która odczytuje wszystkie trasy i zastępuje trasę wspomnianą powyżej.
Więc dodałem to w
di.xml
a moja wtyczka wygląda następująco:
źródło
nie używaj preferencji użyj wtyczki, aby rozszerzyć moduł podstawowy znajdujący się w pliku di.xml
oraz w Product.php
Jak zastąpić blok podstawowy, model i kontroler w Magento2
źródło
around
nie zadziałałoby dla mnie. Chciałem całkowicie zmienić zachowanie oryginalnego kontrolera.Mam przepisać kontroler do modelu recenzji. plik composer.json:
plik register.php
Plik app / code / Apple / Review / etc / module.xml:
W pliku kontrolnym dla modelu recenzji,
app / code / Apple / Review / Controller / Post.php
To działa kod zastępujący kontroler recenzji w magento2. Dzięki.
źródło