Warum kann ich das ProductRepositoryInterface in Magento 2 nicht injizieren?

12

Ich habe eine Controller-Aktion, in die ich das Produkt-Repository einfügen möchte

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;
    }

Unabhängig von der Reihenfolge, in der ich meine Konstruktorargumente anordne, injiziert Magentos Abhängigkeitsinjektion immer eine ungültige Klasse für das productRepositoryArgument, das PHP veranlasst, Fehler zu werfen und zu argumentieren. Der storeManagerGetd spritzt prima. Das Löschen der Caches hat nicht geholfen.

Hier ist die Ausnahme geworfen:

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.

Die Klassennamen und Argumentpositionen in der Fehlermeldung ändern sich, aber die Fehlerdefinition ist immer dieselbe. Wenn Sie das ProductRepositoryInterfaceaus dem Konstruktor entfernen, ist alles wieder in Ordnung.

Mridang Agarwalla
quelle
Betreff: "Die Abhängigkeitsinjektion von Magento injiziert immer eine ungültige Klasse für das Argument productRepository." Wenn Sie den genauen Fehler angeben, können andere das Problem leichter diagnostizieren.
Alan Storm
1
Hast du var / generation gelöscht?
Marius
@AlanStorm. Das tut mir leid. Ich habe die Frage bearbeitet.
Mridang Agarwalla

Antworten:

18

Dies tritt in der Regel auf, wenn Sie dem Konstruktor einen weiteren Parameter hinzufügen, da Magento ihn in var / generation zwischenspeichert. Sie müssen var / generation löschen, wodurch Magento gezwungen wird, den Interceptor neu zu generieren .

Smartie
quelle
Es scheint, dass Sie recht hatten. Ich habe die Caches vom Administrator geleert und das hat nicht geholfen.
Mridang Agarwalla
2
Sieht aus wie in der Neuinstallation, generierte Ordner in der Stammordner-Struktur nicht in var, könnte helfen
Xelber
Ich habe ein benutzerdefiniertes Modul erstellt und diesen Code in der Klasse Custom \ Module \ MagentoU \ Test ausprobiert. 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" />
Ashwani Shukla
Es wurde versucht, dass immer noch derselbe Fehler auftritt. Argument 4, das an Custom \ Module \ MagentoU \ Test :: __ construct () übergeben wird, muss eine Instanz von Custom \ Module \ Api \ ProductRepositoryInterface sein, Instanz von Magento \ Catalog \ Model \ ProductRepository \ Interceptor angegeben
Ashwani Shukla
Laufen php bin/magento setup:upgradeSie
Black
4

Es ist schwer zu sagen, ohne weitere Details, aber ich gehe davon aus, dass Ihr Codebeispiel tatsächlich so aussieht

namespace Packagename\Module\Controller;
class Test extends Action
{

    private $_productRepository;

    public function __construct(
        Context $context,
        StoreManagerInterface $storeManager,
        ProductRepositoryInterface $productRepository    
    ) {
        parent::__construct($context);
        $this->_storeManager = $storeManager;
        $this->_productRepository = $productRepository;
    }
}

dh mit einem PHP-Namespace (da alle Controller in Magento 2 Namespaces haben).

Wenn dies der Fall ist, versuchen Sie in Ihrem Codebeispiel tatsächlich, eine Packagename\Module\Controller\ProductRepositoryInterfaceKlasse zu injizieren . Wenn Sie einen Klassennamen ohne Namespace-Präfix verwenden, geht PHP davon aus, dass Sie eine Klasse im aktuellen Namespace wünschen .

Alan Storm
quelle
4

Ich konnte mit dieser Fehlermeldung kein Modul in eine Steuerung einspeisen. Das Löschen von var / generation hat bei mir funktioniert.

Mike Bahar
quelle
2

Was bei mir funktioniert hat, ist das Ausführen des Kompilierungsbefehls.

/ var / www / magento2-root $ php bin / magento setup: di: compile
Dvarney
quelle
0

In magento 2.2 Ordner löschen:

"generated/code"

Und das wird das Problem lösen.

Jackcar
quelle