Magento 2, le gestionnaire d'objets passe un autre objet alors attendu, pourquoi ?
-
28-09-2020 - |
Question
Juste au moment où je pense comprendre le gestionnaire d'objets Magento 2 et l'injection de dépendances, il se passe quelque chose que je ne comprends pas.je crois que je passe context
fr pagefactory
objets mais Magento dit que je ne le suis pas.Le second semble faux.
Recoverable Error: Argument 2 passed to Demo\Hello\Controller\Adminhtml\Order\MassPrint::__construct() must be an instance of Magento\Framework\View\Result\PageFactory, instance of Magento\Framework\App\ResourceConnection given, called in
Le controlle:
<?php
namespace Demo\Hello\Controller\Adminhtml\Order;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class MassPrint extends \Magento\Backend\App\Action {
public function __construct(Context $context, PageFactory $pageFactory) {
parent::__construct($context);
}
}
Il comprend le type faisant allusion comme je le souhaite :
must be an instance of Magento\Framework\View\Result\PageFactory
Mais ça passe
instance of Magento\Framework\App\ResourceConnection given
Pourquoi est-ce?Il y a une certaine magie qui opère avec Magento que je ne comprends pas (encore).
La solution
TL;DR
Si vous voyez une erreur avec Interceptor.php
assurez-vous de vider /var/generation/
avant de chercher plus loin.Cela vous fera gagner beaucoup de temps.
Explication
Après quelques tests, j'ai trouvé la cause sous-jacente.Lors de la première exécution d'un contrôleur personnalisé, Magento génère automatiquement des fichiers.Jusqu'ici, tout va bien.Dans mon cas, un seul.C'est vivre dans var\generation\
Le chemin complet dans cet exemple serait var\generation\Demo\Hello\Controller\Adminhtml\Order\MassPrint\Interceptor.php
.
Cette classe étend votre contrôleur personnalisé.Alors naturellement, il appelle le constructeur parent dans son propre constructeur.Donc, si vous apportez des modifications au constructeur de votre contrôleur, ce fichier doit être régénéré pour correspondre à votre nouveau code.Si vous ne le faites pas, cela produira des résultats indésirables.Assurez-vous donc de supprimer au moins la classe Interceptor pour ce contrôleur.Il serait plus simple de vider tout le directeur afin que Magento régénére tous les fichiers correspondant à votre nouveau code.
rm -rf var/generation/*
En fait, magento donne une très bonne idée où chercher dans la dernière partie du message d'erreur.
called in /var/generation/Demo/Hello/Controller/Adminhtml/Order/MassPrint/Interceptor.php on line 15