Tengo una acción de controlador en la que me gustaría inyectar el repositorio de productos
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;
}
No importa en qué orden coloque mis argumentos de constructor, la inyección de dependencia de Magento siempre inyecta una clase no válida para el productRepository
argumento que lleva a PHP a lanzar y error de argumento. El storeManager
getd inyectado muy bien. Limpiar los cachés no ha ayudado.
Aquí está la excepción lanzada:
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.
Los nombres de clase y las posiciones de argumento en el mensaje de error cambian, pero la definición de error es siempre la misma. Eliminar el ProductRepositoryInterface
del constructor hace que todo vuelva a estar bien.
magento2
controllers
dependency-injection
action
Mridang Agarwalla
fuente
fuente
Respuestas:
Esto generalmente surge cuando agrega otro parámetro al constructor porque Magento lo almacena en caché en var / generation. Debe borrar var / generation que obliga a Magento a regenerar el interceptor.
fuente
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
tras élEs difícil de decir sin más detalles, pero voy a suponer que su muestra de código en realidad se parece a esto
es decir, con un espacio de nombres PHP (ya que todos los controladores tienen espacios de nombres en Magento 2).
Si ese es el caso, entonces en su muestra de código en realidad está tratando de inyectar una
Packagename\Module\Controller\ProductRepositoryInterface
clase. Si usa un nombre de clase sin un prefijo de espacio de nombres, PHP asume que desea una clase en el espacio de nombres actual .fuente
No pude inyectar ningún módulo a un controlador con este mensaje de error. Eliminar var / generation funcionó para mí ...
fuente
Lo que funcionó para mí es ejecutar el comando de compilación.
fuente
En magento 2.2 eliminar carpeta:
Y eso resolverá el problema.
fuente