J'ai une action de contrôleur dans laquelle je voudrais injecter le référentiel produit
namespace Nosto\Tagging\Controller\Export;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Backend\App\Action;
use Magento\Framework\App\Action\Context;
class Test extends Action
{
private $_productRepository;
public function __construct(
Context $context,
StoreManagerInterface $storeManager,
ProductRepositoryInterface $productRepository
) {
parent::__construct($context);
$this->_storeManager = $storeManager;
$this->_productRepository = $productRepository;
}
Peu importe l'ordre dans lequel je mets mes arguments de constructeur, l'injection de dépendance de Magento injecte toujours une classe non valide pour l' productRepository
argument menant PHP à lancer et l'erreur d'argument. Le storeManager
getd s'injecta très bien. Vider les caches n'a pas aidé.
Voici l'exception levée:
Recoverable Error: Argument 3 passed to Nosto\Tagging\Controller\Export\Test::__construct() must implement interface Magento\Catalog\Api\ProductRepositoryInterface, instance of Nosto\Tagging\Helper\Account given.
Les noms de classe et les positions des arguments dans le message d'erreur changent, mais la définition d'erreur est toujours la même. Le retrait ProductRepositoryInterface
du constructeur rend tout à nouveau correct.
magento2
controllers
dependency-injection
action
Mridang Agarwalla
la source
la source
Réponses:
Cela survient généralement lorsque vous ajoutez un autre paramètre au constructeur car Magento le met en cache dans var / generation. Vous devez effacer var / generation, ce qui oblige Magento à régénérer l'intercepteur.
la source
public function __construct( \Magento\Catalog\Api\ProductRepositoryInterface $productRepository, \Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Checkout\Model\Session $session, \Custom\Module\Api\ProductRepositoryInterface $unit1ProductRepository, array $data, $justAParameter = "" )
<preference for="Custom\Module\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
php bin/magento setup:upgrade
aprèsC'est difficile à dire sans plus de détails, mais je vais supposer que l'exemple de code youe ressemble en fait à ceci
c'est-à-dire avec un espace de noms PHP (puisque tous les contrôleurs ont des espaces de noms dans Magento 2).
Si tel est le cas, dans votre exemple de code, vous essayez en fait d'injecter une
Packagename\Module\Controller\ProductRepositoryInterface
classe. Si vous utilisez un nom de classe sans préfixe d'espace de noms, PHP suppose que vous voulez une classe dans l' espace de noms actuel .la source
Je n'ai pas pu injecter de module à un contrôleur avec ce message d'erreur. La suppression de var / generation a fonctionné pour moi ..
la source
Ce qui a fonctionné pour moi, c'est d'exécuter la commande de compilation.
la source
Dans le dossier de suppression de magento 2.2:
Et cela résoudra le problème.
la source