У меня есть действие контроллера, в которое я хотел бы добавить продукт-хранилище
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 storeManager
GETD вводили только штраф. Очистка кешей не помогла.
Вот исключение:
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
из конструктора делает все хорошо снова.
magento2
controllers
dependency-injection
action
Мриданг Агарвалла
источник
источник
Ответы:
Это обычно возникает, когда вы добавляете другой параметр в конструктор, потому что Magento кэширует его в var / generation. Вам нужно очистить var / generation, что заставит Magento регенерировать перехватчик.
источник
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
за нимТрудно сказать без дальнейших подробностей, но я собираюсь предположить, что пример кода на самом деле выглядит примерно так
то есть с пространством имен PHP (так как все контроллеры имеют пространства имен в Magento 2).
Если это так, то в вашем примере кода вы на самом деле пытаетесь внедрить
Packagename\Module\Controller\ProductRepositoryInterface
класс. Если вы используете имя класса без префикса пространства имен, PHP предполагает, что вам нужен класс в текущем пространстве имен.источник
Я не смог ввести какой-либо модуль в контроллер с этим сообщением об ошибке. Удаление var / generation работало на меня ..
источник
Для меня сработало выполнение команды компиляции.
источник
В magento 2.2 удалите папку:
И это решит проблему.
источник