मैंने आज फिर से इस समस्या में ठोकर खाई है और यह जानना महत्वपूर्ण है कि जब भी श्रृंखला के नीचे निर्भरता होती है, तो यह समस्या पैदा हो जाती है, जिससे एक ऐसी स्थिति उत्पन्न हो जाती है, जिसमें आवेदन की स्थिति जानने की आवश्यकता होती है।
कई मामलों में यह त्रुटि सत्र-बद्ध है (क्योंकि सत्र को आवेदन की स्थिति (फ्रंटएंड या एडमिनिस्ट्रेटर) जानना आवश्यक है)।
मेरे मामले में मुझे Magento\Tax\Api\TaxCalculationInterface
एक सीएलआई कमांड की आवश्यकता थी, लेकिन इसके लिए ग्राहक सत्र (शायद ग्राहक समूह प्राप्त करने के लिए) पर निर्भरता श्रृंखला में कुछ बिंदु की आवश्यकता होती है।
संपादित करें: मैं परदे के पीछे का उपयोग कर एक बेहतर समाधान पाया। लेकिन इतिहास की खातिर, यहाँ मेरा पिछला जवाब है:
इसे हल करने के लिए मैंने अपने कंस्ट्रक्टर में इस इंटरफ़ेस को शामिल नहीं किया, बल्कि यह कारखाना है:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
इस तरह, क्लास को केवल उसी तरीके से त्वरित किया जाता है, जहां मुझे इसकी आवश्यकता थी, और अब निर्माता में नहीं:
$taxCalculation = $this->taxCalculationFactory->create();
इससे मेरे लिए इस विशेष मामले में समस्या हल हो गई।
और अब एक प्रॉक्सी का उपयोग करके उत्तर:
यदि आप श्रृंखला के सभी निर्भरता को ट्रिगर नहीं करना चाहते हैं, तो आपको अपने निर्माता में एक प्रॉक्सी का उपयोग करना चाहिए। मूल दस्तावेज के अनुसार :
... कंस्ट्रक्टर इंजेक्शन का मतलब यह भी है कि ऑब्जेक्ट इंस्टेंटेशन की एक चेन रिएक्शन अक्सर परिणाम होता है जब आप ऑब्जेक्ट बनाते हैं।
तथा:
... प्रॉक्सी अन्य कक्षाओं का विस्तार करते हुए उनमें से आलसी-लोडेड संस्करण बन जाते हैं। यही है, वर्ग का एक वास्तविक उदाहरण एक प्रॉक्सी का विस्तार होता है जो वर्ग के तरीकों में से एक के बाद ही बनता है।
इसलिए, मेरी स्थिति में, TaxCalculationInterface
मुझे जो कुछ भी करना था, वह मेरे कर की गणना को मेरे निर्माता के छद्म के रूप में तुरंत करना था:
/**
* @var \Magento\Tax\Api\TaxCalculationInterface\Proxy
*/
protected $taxCalculation;
/**
* @param \Magento\Tax\Api\TaxCalculationInterface\Proxy $taxCalculation
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterface\Proxy $taxCalculation
) {
$this->taxCalculation = $taxCalculation;
}
इस तरह, मेरी कक्षा आलसी है। यह है: जैसे ही मैं इसे तरीकों में से एक कहता हूं, यह केवल त्वरित है। उदाहरण के लिए:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);