Как я могу переписать контроллер (это на самом деле действие) в Magento 2?
Я пытался, как указано здесь, вот так:
У меня есть свой собственный модуль Namespace_Module
с di.xml
файлом, который учитывается, потому что одна и та же система работает с моделями и блоками.
Пример:
<?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>
Я пытаюсь заменить статистику обновления панели управления своими собственными действиями. Делая это, как описано выше, execute
метод в исходном классе по-прежнему вызывается, а не мой собственный.
var/cache
и var/generation
были очищены.
Ответы:
Нашел это.
На самом деле, то, что я написал в вопросе, является правильным способом переписать контроллер.
работает хорошо.
Проблема для меня была в этом. Я забыл упомянуть, что я удалил некоторые модули Magento2, и среди них был
Reports
модуль. Я не сформулировал это в вопросе, потому что не думал, что это было важно.Приведенный выше метод переписывания контроллеров (и, возможно, других классов) работает, если существуют все классы, которые вы пытаетесь изменить, и все их родительские классы.
Так что оригинал
Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
расширяетMagento\Reports\Controller\Adminhtml\Report\Statistics
то, что я убрал.В magento 2 маршруты собираются путем сканирования папок
Controller
папок для всех включенных модулей, и они собираются в массив.Все идет нормально.
Я заканчиваю с этой строкой среди других:
Затем запрос сопоставляется с маршрутом,
magento\backend\controller\adminhtml\dashboard\refreshstatistics
и Magento проверяет, является ли класс, соответствующий этому маршруту, подклассомMagento\Framework\App\ActionInterface
. Поскольку маршруты собираются до того, как мой класс должен быть идентифицирован и создан, старый класс проверяется вместо моего собственного. И родительский класс этого классаMagento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
не существует.Решение сохранить модуль отчетов отключенным, но все же заставить его работать, состоит в создании перехватчика для метода, который считывает все маршруты и заменяет маршрут, упомянутый выше.
Поэтому я добавил это в
di.xml
и мой плагин выглядит так:
источник
не используйте предпочтения, используйте плагин для расширения любого основного модуля, который находится в di.xml
и в Product.php
Как переопределить основной блок, модель и контроллер в Magento2
источник
around
что не будет работать для меня. Я хотел полностью изменить поведение оригинального контроллера.Я переписал контроллер для обзора модели. файл composer.json:
файл registration.php
Файл app / code / Apple / Review / etc / module.xml:
В файле контроллера для модели обзора,
Приложение / код / Apple / Обзор / Controller / Post.php
Это рабочий код для переопределения контроллера обзора в magento2. Благодарю.
источник