Чому я не можу ввести інтерфейс ProductRepositoryInterface в Magento 2?


12

У мене є дія контролера, в яку я хотів би ввести продукт-сховище

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

Незалежно від того, в якому порядку я ставлю аргументи свого конструктора, Magento-залежність-injection завжди вводить недійсний клас для productRepositoryаргументу, що веде PHP до кидання та помилки аргументу. storeManagerGETD вводили тільки штраф. Очищення кешів не допомогло.

Ось викинутий виняток:

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.

Назви класів та позиції аргументів у повідомленні про помилку змінюються, але визначення помилки завжди однакове. Видалення ProductRepositoryInterfaceз конструктора робить все знову добре.


Re: "Залежність Magento-введення завжди вводить недійсний клас для аргументу productRepository" Включення точної помилки допоможе іншим людям діагностувати проблему.
Алан Шторм

1
Ви очистили вар / покоління?
Маріус

@AlanStorm. Вибач за це. Я редагував питання.
Mridang Agarwalla

Відповіді:


18

Зазвичай це з'являється, коли ви додаєте інший параметр до конструктора, оскільки Magento кешує його у var / generation. Вам потрібно очистити вар / покоління, що змушує Magento відновити перехоплювач.


Здається, ви мали рацію. Я очищав кеші від адміністратора, і це не допомогло.
Mridang Agarwalla

2
Схоже, що в новій установці створена папка знаходиться в структурі кореневої папки, а не в var, може допомогти
xelber

Я створив спеціальний модуль і спробував цей код всередині класу 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

Спробував все, що все-таки отримує ту саму помилку Аргумент 4 передано на користувальницький \ Модуль \ MagentoU \ Test :: __ construct () повинен бути екземпляром користувальницького \ Модуля \ Api \ ProductRepositoryInterface, примірника Magento \ Каталог \ Модель \ ProductRepository \ Перехоплювач заданий
Ashwani Шукла

Біжи php bin/magento setup:upgradeза ним
Чорний

4

Важко сказати без додаткових подробиць, але я припускаю, що зразок коду Youe насправді виглядає приблизно так

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

тобто з простором імен PHP (оскільки всі контролери мають простори імен у Magento 2).

Якщо це так, то у прикладі коду ви насправді намагаєтесь ввести Packagename\Module\Controller\ProductRepositoryInterfaceклас. Якщо ви використовуєте ім'я класу без префіксу простору імен, PHP передбачає, що ви хочете клас у поточній області імен.


4

Мені не вдалося ввести жоден модуль до контролера з цим повідомленням про помилку. Видалення var / покоління працювало для мене ..


2

Те, що працювало для мене, - це команда компілювати.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.