¿Cómo puedo reescribir un controlador (que en realidad es una acción) en Magento 2?
Intenté, como se indica aquí, así:
Tengo mi propio módulo llamado Namespace_Module
con un di.xml
archivo, que se tiene en cuenta, porque el mismo sistema funciona en modelos y bloques
Ejemplo:
<?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>
Estoy tratando de reemplazar las estadísticas de actualización del tablero con mi propia acción. Haciéndolo como anteriormente, el execute
método en la clase original todavía se llama y no el mío.
var/cache
y var/generation
fueron despejados.
Respuestas:
Lo encontré.
En realidad, lo que publiqué en la pregunta es la forma correcta de reescribir un controlador.
funciona bien
El problema para mí fue esto. Olvidé mencionar que eliminé algunos módulos de Magento2 y entre ellos estaba el
Reports
módulo. No lo dije en la pregunta porque no pensé que fuera significativo.El método anterior para reescribir los controladores (y tal vez otras clases) funciona si todas las clases que intenta cambiar existen y también todas sus clases principales.
Entonces el original se
Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
extiendeMagento\Reports\Controller\Adminhtml\Report\Statistics
que había eliminado.En magento 2, las rutas se recopilan escaneando las carpetas de
Controller
carpetas para todos los módulos habilitados y se recopilan en una matriz.Hasta aquí todo bien.
Termino con esta línea entre otras:
Luego, la solicitud coincide con la ruta
magento\backend\controller\adminhtml\dashboard\refreshstatistics
y Magento comprueba si la clase correspondiente a esa ruta es una subclase deMagento\Framework\App\ActionInterface
. Dado que las rutas se recopilan antes de que mi clase se identifique e instancia, la clase anterior se valida en lugar de la mía. Y la clase padre de la claseMagento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
no existe.Una solución para mantener el módulo de informes deshabilitado pero aún así hacerlo funcionar es crear un interceptor para el método que lea todas las rutas y reemplace la ruta mencionada anteriormente.
Así que agregué esto en
di.xml
y mi complemento se ve así:
fuente
no use el complemento de preferencia para extender cualquier módulo principal que esté en di.xml
y en Product.php
Cómo anular el bloque central, el modelo y el controlador en Magento2
fuente
around
no funcionaría para mí. Quería cambiar completamente el comportamiento del controlador original.Tengo reescribir el controlador para el modelo de revisión. archivo composer.json:
registro.php archivo
archivo app / code / Apple / Review / etc / module.xml:
En el archivo del controlador para el modelo de revisión,
app / code / Apple / Review / Controller / Post.php
Este es el código de trabajo para la anulación del controlador de revisión en magento2. Gracias.
fuente