Почему я не могу внедрить интерфейс 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 всегда вводит недопустимый класс для productRepositoryаргумента, приводящего к выбрасыванию PHP и аргумента error 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. Прости за это. Я редактировал вопрос.
Мриданг Агарвалла

Ответы:

18

Это обычно возникает, когда вы добавляете другой параметр в конструктор, потому что Magento кэширует его в var / generation. Вам нужно очистить var / generation, что заставит Magento регенерировать перехватчик.

Smartie
источник
Кажется, ты был прав. Я очищал кеш от админа, и это не помогло.
Мриданг Агарвалла
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" />
Ашвани Шукла
Пробовал все, что получало ту же ошибку. Аргумент 4, передаваемый в Custom \ Module \ MagentoU \ Test :: __ construct (), должен быть экземпляром Custom \ Module \ Api \ ProductRepositoryInterface, экземпляром Magento \ Catalog \ Model \ ProductRepository \ данный перехватчик
Ashwani Шукла
Беги php bin/magento setup:upgradeза ним
черный
4

Трудно сказать без дальнейших подробностей, но я собираюсь предположить, что пример кода на самом деле выглядит примерно так

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 / generation работало на меня ..

Майк Бахар
источник
2

Для меня сработало выполнение команды компиляции.

/ var / www / magento2-root $ php bin / magento setup: di: compile
dvarney
источник
0

В magento 2.2 удалите папку:

"generated/code"

И это решит проблему.

jackcar
источник