Dlaczego nie mogę wstrzyknąć interfejsu ProductRepositoryInterface do Magento 2?

12

Mam działanie kontrolera, do którego chciałbym wstrzyknąć repozytorium produktów

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

Bez względu na kolejność, w jakiej układam moje argumenty konstruktora, wstrzykiwanie zależności Magento zawsze wstrzykuje niepoprawną klasę dla productRepositoryargumentu prowadzącego PHP do błędu i błędu argumentu. storeManagerGETD wstrzykuje dobrze. Czyszczenie pamięci podręcznej nie pomogło.

Oto zgłoszony wyjątek:

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.

Nazwy klas i pozycje argumentów w komunikacie o błędzie zmieniają się, ale definicja błędu jest zawsze taka sama. Usunięcie ProductRepositoryInterfacekonstruktora sprawia, że ​​wszystko jest w porządku.

Mridang Agarwalla
źródło
Re: „Wstrzykiwanie zależności Magento zawsze wstrzykuje nieprawidłową klasę argumentu productRepository”. Podanie dokładnego błędu pomoże innym osobom zdiagnozować problem.
Alan Storm
1
czy wyczyściłeś var / generację?
Marius
@AlanStorm. Przepraszam za to. Zredagowałem pytanie.
Mridang Agarwalla

Odpowiedzi:

18

Zwykle pojawia się, gdy dodajesz kolejny parametr do konstruktora, ponieważ Magento buforuje go w var / generation. Musisz wyczyścić var ​​/ generację, która zmusza Magento do zregenerowania przechwytywacza.

Smartie
źródło
Wygląda na to, że miałeś rację. Wyczyściłem pamięć podręczną od administratora i to nie pomogło.
Mridang Agarwalla,
2
Wygląda na to, że w nowej instalacji wygenerowany folder znajduje się w strukturze folderu głównego, a nie w var, może pomóc
xelber
Utworzyłem moduł niestandardowy i próbuję tego kodu w klasie Custom \ Module \ MagentoU \ Test; 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
Próbowałem, aby nadal występował ten sam błąd Argument 4 przekazany do Custom \ Module \ MagentoU \ Test :: __ construct () musi być instancją Custom \ Module \ Api \ ProductRepositoryInterface, instancją Magento \ Catalogue \ Model \ ProductRepository \ Interceptor podano
Ashwani Shukla,
Biegnij php bin/magento setup:upgradeza nim
Black
4

Trudno powiedzieć bez dalszych szczegółów, ale mam zamiar założyć youe przykładowy kod faktycznie wygląda mniej więcej tak

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

tj. z przestrzenią nazw PHP (ponieważ wszystkie kontrolery mają przestrzenie nazw w Magento 2).

W takim przypadku w próbce kodu próbujesz wstrzyknąć Packagename\Module\Controller\ProductRepositoryInterfaceklasę. Jeśli używasz nazwy klasy bez prefiksu przestrzeni nazw, PHP zakłada, że ​​chcesz klasy w bieżącej przestrzeni nazw.

Alan Storm
źródło
4

Nie mogłem wstrzyknąć żadnego modułu do kontrolera z tym komunikatem o błędzie. Usuwanie var / generation działało dla mnie ..

Mike Bahar
źródło
2

Dla mnie zadziałało uruchomienie polecenia kompilacji.

/ var / www / magento2-root $ php bin / magento setup: di: compile
dvarney
źródło
0

W folderze usuwania magento 2.2:

"generated/code"

I to rozwiąże problem.

jackcar
źródło