मैं Magento 2 में ProductRepositoryInterface को इंजेक्ट क्यों नहीं कर सकता?


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

कोई फर्क नहीं पड़ता कि मैं अपने रचनाकार तर्कों को किस क्रम में रखता हूं, मैगेंटो की निर्भरता-इंजेक्शन हमेशा productRepositoryPHP को फेंकने और तर्क में त्रुटि के लिए तर्क के लिए एक अमान्य वर्ग इंजेक्ट करता है । 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कंस्ट्रक्टर से हटाने पर फिर से सब कुछ ठीक हो जाता है।


पुन: "Magento के निर्भरता-इंजेक्शन हमेशा ProductRepository तर्क के लिए एक अमान्य वर्ग इंजेक्षन करता है" सटीक त्रुटि को शामिल करने से अन्य लोगों को समस्या का निदान करने में मदद मिलेगी।
एलन स्टॉर्म

1
क्या आपने var / जनरेशन को क्लियर किया?
मारियस

@AlanStorm। उसके लिए माफ़ करना। मैंने प्रश्न संपादित किया है।
मृदंग अग्रवाल

जवाबों:


18

यह आम तौर पर तब होता है जब आप कंस्ट्रक्टर में एक और पैरामीटर जोड़ते हैं क्योंकि Magento इसे var / जनरेशन में कैश करता है। आपको var / Generate को क्लियर करना होगा जो Magento को इंटरसेप्टर को फिर से बनाने के लिए मजबूर करता है।


ऐसा लगता है कि आप सही थे। मैं व्यवस्थापक से कैश साफ़ कर रहा हूं और इससे कोई मदद नहीं मिली है।
मृदंग अग्रवाल

2
ऐसा लगता है कि नई स्थापना में, जनरेट किया गया फ़ोल्डर रूट फ़ोल्डर संरचना में है, जो var में नहीं है, मदद कर सकता है
xelber

मैंने एक कस्टम मॉड्यूल बनाया है और इस कोड को कस्टम \ मॉड्यूल \ 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 मॉड्यूल \ MaguleU \ Test :: __ निर्माण करने के लिए पारित कर दिया गया है :: __ निर्माण () कस्टम \ मॉड्यूल \ Api \ ProductRepositoryInterface का उदाहरण होना चाहिए, Magento के कैटलॉग का उदाहरण \ Model \ ProductRepository \ Interceptor दिया
अश्विनी शुक्ल

भागो 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 / पीढ़ी को हटाना ।।


2

मेरे लिए जो काम किया है वह संकलन कमांड चला रहा है।

/ var / www / magento2-root $ php bin / magento सेटअप: di: संकलन

0

Magento 2.2 में फ़ोल्डर हटाएँ:

"generated/code"

और वह समस्या का समाधान करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.