comment puis-je réécrire un contrôleur (c'est en fait une action) dans Magento 2?
J'ai essayé, comme indiqué ici comme ceci:
J'ai mon propre module appelé Namespace_Module
avec un di.xml
fichier, qui est pris en considération, car le même système fonctionne sur les modèles et les blocs.
Exemple:
<?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>
J'essaie de remplacer les statistiques de rafraîchissement du tableau de bord par ma propre action. En procédant comme ci-dessus, la execute
méthode de la classe d'origine est toujours appelée et non la mienne.
var/cache
et var/generation
ont été effacés.
Réponses:
Je l'ai trouvé.
En fait, ce que j'ai posté dans la question, c'est la bonne façon de réécrire un contrôleur.
fonctionne bien.
Le problème pour moi était le suivant. J'ai oublié de mentionner que j'ai supprimé certains modules Magento2 et parmi ceux-ci c'était le
Reports
module. Je ne l'ai pas dit dans la question parce que je ne pensais pas que c'était significatif.La méthode ci-dessus pour réécrire les contrôleurs (et peut-être d'autres classes) fonctionne si toutes les classes que vous essayez de changer existent et toutes leurs classes parentes également.
Donc, l'original
Magento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
s'étendMagento\Reports\Controller\Adminhtml\Report\Statistics
que j'avais supprimé.Dans magento 2, les itinéraires sont collectés en analysant les dossiers des
Controller
dossiers pour tous les modules activés et ils sont collectés dans un tableau.Jusqu'ici tout va bien.
Je me retrouve avec cette ligne entre autres:
Ensuite, la demande est mise en correspondance avec l'itinéraire
magento\backend\controller\adminhtml\dashboard\refreshstatistics
et Magento vérifie si la classe correspondant à cet itinéraire est une sous-classe deMagento\Framework\App\ActionInterface
. Étant donné que les itinéraires sont collectés avant que ma classe ne soit identifiée et instanciée, l'ancienne classe est validée à la place de la mienne. Et la classe parente de la classeMagento\Backend\Controller\Adminhtml\Dashboard\RefreshStatistics
n'existe pas.Une solution pour garder le module de rapports désactivé mais le faire fonctionner est de créer un intercepteur pour la méthode qui lit toutes les routes et de remplacer la route mentionnée ci-dessus.
J'ai donc ajouté ceci dans
di.xml
et mon plugin ressemble à ceci:
la source
ne pas utiliser de préférence utiliser le plugin pour étendre n'importe quel module de base qui est en di.xml
et dans Product.php
Comment remplacer le bloc de base, le modèle et le contrôleur dans Magento2
la source
around
ne marcherait pas pour moi. Je voulais changer complètement le comportement du contrôleur d'origine.J'ai réécrire le contrôleur pour le modèle d'examen. Fichier composer.json:
fichier registration.php
fichier app / code / Apple / Review / etc / module.xml:
Dans le fichier du contrôleur pour le modèle de révision,
app / code / Apple / Review / Controller / Post.php
Il s'agit du code de travail pour la révision du contrôleur dans magento2. Merci.
la source