Mam działanie kontrolera, do którego chciałbym wstrzyknąć repozytorium produktów
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;
}
Bez względu na kolejność, w jakiej układam moje argumenty konstruktora, wstrzykiwanie zależności Magento zawsze wstrzykuje niepoprawną klasę dla productRepository
argumentu prowadzącego PHP do błędu i błędu argumentu. storeManager
GETD wstrzykuje dobrze. Czyszczenie pamięci podręcznej nie pomogło.
Oto zgłoszony wyjątek:
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.
Nazwy klas i pozycje argumentów w komunikacie o błędzie zmieniają się, ale definicja błędu jest zawsze taka sama. Usunięcie ProductRepositoryInterface
konstruktora sprawia, że wszystko jest w porządku.
magento2
controllers
dependency-injection
action
Mridang Agarwalla
źródło
źródło
Odpowiedzi:
Zwykle pojawia się, gdy dodajesz kolejny parametr do konstruktora, ponieważ Magento buforuje go w var / generation. Musisz wyczyścić var / generację, która zmusza Magento do zregenerowania przechwytywacza.
źródło
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
za nimTrudno powiedzieć bez dalszych szczegółów, ale mam zamiar założyć youe przykładowy kod faktycznie wygląda mniej więcej tak
tj. z przestrzenią nazw PHP (ponieważ wszystkie kontrolery mają przestrzenie nazw w Magento 2).
W takim przypadku w próbce kodu próbujesz wstrzyknąć
Packagename\Module\Controller\ProductRepositoryInterface
klasę. Jeśli używasz nazwy klasy bez prefiksu przestrzeni nazw, PHP zakłada, że chcesz klasy w bieżącej przestrzeni nazw.źródło
Nie mogłem wstrzyknąć żadnego modułu do kontrolera z tym komunikatem o błędzie. Usuwanie var / generation działało dla mnie ..
źródło
Dla mnie zadziałało uruchomienie polecenia kompilacji.
źródło
W folderze usuwania magento 2.2:
I to rozwiąże problem.
źródło