¿Por qué no puedo inyectar ProductRepositoryInterface en Magento 2?

12

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 productRepositoryargumento que lleva a PHP a lanzar y error de argumento. El storeManagergetd 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 ProductRepositoryInterfacedel constructor hace que todo vuelva a estar bien.

Mridang Agarwalla
fuente
Re: "La inyección de dependencia de Magento siempre inyecta una clase no válida para el argumento ProductRepository" Incluir el error exacto ayudará a otras personas a diagnosticar el problema.
Alan Storm
1
¿borraste var / generation?
Marius
@AlanStorm. Lo siento por eso. He editado la pregunta.
Mridang Agarwalla 01 de

Respuestas:

18

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.

Smartie
fuente
Parece que tenías razón. He estado limpiando los cachés del administrador y eso no ayudó.
Mridang Agarwalla
2
Se ve como en la nueva instalación, la carpeta generada se encuentra en la estructura de la carpeta raíz no en var, podría ayudar
xelber
Creé un módulo personalizado y probé este código dentro de la clase 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
Probé que todo sigue obteniendo el mismo error. El argumento 4 pasó a Custom \ Module \ MagentoU \ Test :: __ construct () debe ser una instancia de Custom \ Module \ Api \ ProductRepositoryInterface, instancia de Magento \ Catalog \ Model \ ProductRepository \ Interceptor dado
Ashwani Shukla
Corre php bin/magento setup:upgradetras él
Negro
4

Es difícil de decir sin más detalles, pero voy a suponer que su muestra de código en realidad se parece a esto

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

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\ProductRepositoryInterfaceclase. 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 .

Alan Storm
fuente
4

No pude inyectar ningún módulo a un controlador con este mensaje de error. Eliminar var / generation funcionó para mí ...

Mike Bahar
fuente
2

Lo que funcionó para mí es ejecutar el comando de compilación.

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

En magento 2.2 eliminar carpeta:

"generated/code"

Y eso resolverá el problema.

Jackcar
fuente