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).

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top