como posso reescrever um controlador (isso é realmente uma ação) no Magento 2?
Eu tentei, como instruído aqui assim:
Eu tenho meu próprio módulo chamado Namespace_Module
com um di.xml
arquivo, que é levado em consideração, porque o mesmo sistema funciona em modelos e blocos
Exemplo:
<?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>
Estou tentando substituir as estatísticas de atualização do painel por minha própria ação. Fazendo isso como acima, o execute
método na classe original ainda é chamado e não o meu.
var/cache
e var/generation
foram limpos.
Respostas:
Encontrei.
Na verdade, o que eu postei na pergunta é a maneira correta de reescrever um controlador.
funciona bem.
O problema para mim era esse. Esqueci de mencionar que removi alguns módulos Magento2 e dentre estes estava o
Reports
módulo. Não indiquei isso na questão porque não achei significativo.O método acima para reescrever controladores (e talvez outras classes) funciona se todas as classes que você está tentando alterar existirem e todas as classes pai também.
Portanto, o original
Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
se estendeMagento\Reports\Controller\Adminhtml\Report\Statistics
que eu removi.No magento 2, as rotas são coletadas examinando as pastas das
Controller
pastas em busca de todos os módulos ativados e são coletadas em uma matriz.Por enquanto, tudo bem.
Termino com essa linha, entre outras:
Em seguida, a solicitação é correspondida à rota
magento\backend\controller\adminhtml\dashboard\refreshstatistics
e o Magento verifica se a classe correspondente a essa rota é subclasse deMagento\Framework\App\ActionInterface
. Como as rotas são coletadas antes que minha classe seja identificada e instanciada, a classe antiga é validada em vez da minha. E a classe pai da classeMagento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
não existe.Uma solução para manter o módulo de relatórios desativado, mas ainda fazê-lo funcionar, é criar um interceptador para o método que lê todas as rotas e substitui a rota mencionada acima.
Então eu adicionei isso em
di.xml
e meu plugin fica assim:
fonte
não use o preferência use o plugin para estender qualquer módulo principal que esteja no di.xml
e no Product.php
Como substituir o bloco principal, modelo e controlador no Magento2
fonte
around
não funcionaria para mim. Eu queria mudar completamente o comportamento do controlador original.Reescrevi o controlador para o modelo de revisão. arquivo composer.json:
arquivo registration.php
arquivo app / code / Apple / Review / etc / module.xml:
No arquivo do controlador para o modelo de revisão,
app / code / Apple / Review / Controller / Post.php
Este é um código funcional para a substituição do controlador de revisão no magento2. Obrigado.
fonte