Magento 2 में कस्टम CLI कमांड में 'एरिया कोड सेट नहीं' मुद्दा


46

मुझे डेटा अपडेट करते समय निम्न त्रुटि हो रही है CustomerRepositoryInterface

[Magento\Framework\Exception\SessionException]  
Area code not set: Area code must be set before starting a session.

[Magento\Framework\Exception\LocalizedException]  
Area code is not set                              

निम्नलिखित मेरी di.xmlफाइल है

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Console\CommandList">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="test1_command" xsi:type="object">Test\Module\Console\Command\Test1Command</item>
                <item name="test2_command" xsi:type="object">Test\Module\Console\Command\Test2Command</item>
            </argument>
        </arguments>
    </type>
</config>

क्या आप कृपया अपना कोड दिखा सकते हैं और अधिक संदर्भ दे सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?
नाथन टॉम्ब्स

मैं उसी मुद्दे का सामना कर रहा हूं। हालाँकि ऊपर दिखाया गया समाधान मेरे लिए कारगर नहीं है। यह अब मुझे हफ्तों तक परेशान कर रहा है।
Stevenlavine

जवाबों:


63

क्षेत्र Magento CLI में सेट नहीं है (यह किसी भी कोर कमांड के लिए आवश्यक नहीं है)। इसे आपके कमांड के executeतरीके की शुरुआत में सेट किया जा सकता है :

/** @var \Magento\Framework\App\State **/
private $state;

public function __construct(\Magento\Framework\App\State $state) {
    $this->state = $state;
    parent::__construct();
}

public function execute() {
    $this->state->setAreaCode(\Magento\Framework\App\Area::AREA_FRONTEND); // or \Magento\Framework\App\Area::AREA_ADMINHTML, depending on your needs
}

6
FYI करें, आप "adminhtml" मेरे लिए काम नहीं कर रहे थे। "व्यवस्थापक" ने काम किया।
फीनिक्स128_रीकॉर्डो

मेरे लिए यह काम नहीं करता है ( adminया adminhtml) - एक त्रुटि है Area code already set:। लेकिन फिर, अगर मैं इसे टिप्पणी करता हूं तो फिर से विषय से अपवाद है।
बार्टोज़ कुबिकी

13
आपको \Magento\Framework\App\Area::AREA_*
हार्डकॉन्ड

3
यह सबसे अच्छा नहीं है कि आपके निर्माता में क्षेत्र कोड सेट न करें; जब भी आप चलाते हैं bin/magento सभी कंस्ट्रक्टर निष्पादित होते हैं, और यदि क्षेत्र कोड को 2 बार सेट करने की कोशिश की जाती है तो एक अपवाद फेंक दिया जाता है। execute()यदि आपके राज्य में आवश्यक हो तो क्षेत्र कोड को अपने -मिथोड में सेट करना बेहतर है , या अपने कोड को स्टोर- या क्षेत्र अनुकरण में चलाना बेहतर है। इसके अलावा: निर्माणकर्ता निर्भरताएं जो एक सत्र को ट्रिगर कर सकती हैं श्रृंखला को एक क्षेत्र कोड सेट करने से निर्भरता को रोकने के लिए एक कारखाने या प्रॉक्सी का उपयोग करके आरंभ किया जाना चाहिए।
गियल बर्क

1
कृपया इसे एक सही उत्तर समझें। जब हम कंस्ट्रक्टर में एरिया कोड सेट करते हैं तो यह अपवाद बनता है।
संदीपन S

33

मैंने आज फिर से इस समस्या में ठोकर खाई है और यह जानना महत्वपूर्ण है कि जब भी श्रृंखला के नीचे निर्भरता होती है, तो यह समस्या पैदा हो जाती है, जिससे एक ऐसी स्थिति उत्पन्न हो जाती है, जिसमें आवेदन की स्थिति जानने की आवश्यकता होती है।

कई मामलों में यह त्रुटि सत्र-बद्ध है (क्योंकि सत्र को आवेदन की स्थिति (फ्रंटएंड या एडमिनिस्ट्रेटर) जानना आवश्यक है)।

मेरे मामले में मुझे 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);

17

आपको CLI कमांड setAreaCodeके __constructलिए उपयोग नहीं करना चाहिए । जब आप कोई भी कमांड Magento चलाते हैं और अपने आवेदन में पंजीकृत प्रत्येक स्क्रिप्ट के लिए उदाहरण बनाते हैं। यदि __constructक्षेत्र कोड परिभाषा के साथ एक से अधिक हैं तो आपको त्रुटि होगी।

मुझे लगता है कि execute()क्षेत्र कोड सेट करने के लिए विधि का उपयोग करना बेहतर है । कैटलॉग मॉड्यूल की जाँच करें: vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php


1
मेरी समझ मे आ रहा है। कोई और इस पर टिप्पणी जोड़ना चाहता है?

यह सही है, स्वीकृत उत्तर पर मेरी टिप्पणी भी देखें: यह सबसे अच्छा है कि आपके निर्माता में क्षेत्र कोड निर्धारित न करें; जब भी आप चलाते हैं bin/magento सभी कंस्ट्रक्टर निष्पादित होते हैं, और यदि क्षेत्र कोड को 2 बार सेट करने की कोशिश की जाती है तो एक अपवाद फेंक दिया जाता है। execute()यदि आपके राज्य में आवश्यक हो तो क्षेत्र कोड को अपने -मिथोड में सेट करना बेहतर है , या अपने कोड को स्टोर- या क्षेत्र अनुकरण में चलाना बेहतर है। इसके अलावा: निर्माणकर्ता निर्भरताएं जो एक सत्र को ट्रिगर कर सकती हैं श्रृंखला को एक क्षेत्र कोड सेट करने से रोकने के लिए कारखाने या प्रॉक्सी का उपयोग करके आरंभ किया जाना चाहिए।
गियल बर्क

मगर Magento 2.2 में, इंजेक्शन लगाने के लिए \ Magento \ Sales \ Api \ Data \ OrderInterface या \ Magento \ Sales \ Api \ OrderManagementInterface कमांड क्लास कंस्ट्रक्शन में Magento के \ फ्रेमवर्क / सत्र \ सत्र \ _- का निर्माण करेगा -> __ कंस्ट्रक्शन () और "क्षेत्र को समाप्त नहीं करेगा" सेट"। यह 2.1 नहीं होता है। क्योंकि मॉड्यूल-यूआई / कॉन्फिगर / रीडर / डेफिनिशन / डेटा 2.2 में पेश किया गया है, हम इसे कैसे हल करते हैं?
डोनी विबवो

4

इस क्षेत्रकोड समस्या के लिए, अगर 'फ्रंटेंड' पैरामीटर काम नहीं कर रहा है, तो कोशिश करें:

$this->_state->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL);

मेरे लिए काम कर रहा था, आशा है कि यह मदद करता है


मुझे इस कोड को किस फ़ाइल में जोड़ना चाहिए? मुझे भी ठीक यही समस्या है।
मैग्नेटो लर्नर

@ XXX मुझे कस्टम कमांड से यह समस्या थी, इसलिए मैंने इसे मेरे द्वारा बनाई गई कमांड फ़ाइल में लिखा। आप इसे निष्पादित कार्य में जोड़ सकते हैं, कुछ इस तरह से:try { $this->_state->... } finally { $this->executeMyCommand() }
डिपेंडेंसीहेल

4

ज्यादातर मामलों में अपवाद कंसोल कमांड में किए गए कुछ कार्यों के कारण होता है। समाधान (एरिया कोड सेट करने के बजाय) एरिया कोड का अनुकरण करना और उपयोग करके कार्रवाई करना है

$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);

जहां $stateकी वस्तु है Magento\Framework\App\State। अलग-अलग जगह पर क्षेत्र सेट करना एक समस्या है, क्योंकि यह कॉल के बीच संघर्ष का कारण बन सकता है।


मैं इस संदर्भ का उपयोग कर रहा हूं और समान त्रुटि प्राप्त कर रहा हूं क्षेत्र कोड पहले से ही मेरे नियंत्रक में सेट है, क्या आप मुझे इससे बाहर निकलने में मदद कर सकते हैं। मैंने अपने निर्माण कार्य में सेटैरोड को कॉल करने जैसे परिवर्तन किए हैं, लेकिन एक ही त्रुटि हो रही है।
गगन


1

समस्या यह है कि इसके पास कोई भी तरीका नहीं है जो चर क्षेत्र_कोड सेट नहीं होने पर झूठा वापस आ जाता है। जिस तरह से मैंने इसे हल करने के लिए पाया, वह राज्य वर्ग के ओवरराइड बनाने और area_code सेट होने पर मान्य करने के लिए एक नई विधि बनाने के लिए था।

मेरी फाइल में di.xml

    <preference for="Magento\Framework\App\State" type="Webjump\Abacos\App\State" />

Createad फ़ाइल Webjump \ Abacos \ App \ State

namespace Webjump\Abacos\App;

class State extends \Magento\Framework\App\State
{
    public function validateAreaCode()
    {
        if (!isset($this->_areaCode)) {
            return false;
        }
        return true;
    }
}

उपयोग

/**
* @var \Magento\Framework\App\State
*/
protected $state;

public function __construct(
            \Magento\Framework\App\State $state
)
{
$this->state = $state;
if (!$this->state->validateAreaCode()) {
 $this->state->setAreaCode(\Magento\Framework\App\Area::AREA_ADMINHTML);
}
}

1

में Magento 2 आप निर्धारित करते हैं AreadCode लेकिन अभी भी मिलता है इस त्रुटि तो कोड निम्न प्रयास करें।

  • उपयोग Magento\Framework\App\Bootstrap;
  • शामिल app/bootstrap.php;
  • $ बूटस्ट्रैप = Bootstrap::create(BP, $_SERVER);
  • $ वस्तु = $bootstrap->getObjectManager();
  • $ राज्य = $objectManager->get('Magento\Framework\App\State');
  • $ राज्य> setAreaCode ( 'वैश्विक');

0

मैं bin/magento setup:upgradeउत्पादन से आयात डेटाबेस के बाद चल रहे 'एरिया कोड सेट नहीं है' त्रुटि से पीड़ित था । यह इस विषय के विषय से थोड़ा अलग मामला है, लेकिन शायद किसी की मदद करेगा। मैं इस समस्या को स्थानीय रूप से चलाने में सक्षम था, bin/magento deploy:mode:set developerक्योंकि मैं पहले से ही डेवलपर मोड में था। Magento ने कुछ कॉन्फ़िगरेशन समायोजन किए, विशेष रूप से मेरे लिए debug_log ने भूमिका निभाई।


0

मुझे प्रॉक्सी क्लास का उपयोग करके समाधान मिला। उदाहरण है

use Klevu\Search\Model\Product\MagentoProductActionsInterface\Proxy as MagentoProductActionsInterface;

public function __construct(
        MagentoProductActionsInterface $magentoProductActionsInterface
    )
    {
        $this->_magentoProductActionsInterface = $magentoProductActionsInterface;
        parent::__construct();
    }

इससे मेरा मुद्दा ठीक हो गया


-1

मुझे सेटअप अपग्रेड करते समय एरिया कोड के साथ एक ही मुद्दा मिला है।

Module 'Magento_WebsiteRestriction':Installing data... Area code not set: Area code must be set before starting a session

मैंने सभी तृतीय पक्ष मॉड्यूलों को निष्क्रिय कर दिया है और चला रहा हूं setup:upgrade

फिर मैंने तीसरे पक्ष के सभी मॉड्यूलों को फिर से सक्षम किया है और एक ही कमांड चलाया है। मेरे लिए समस्या हल हो गई है आशा है कि यह आपके लिए मदद है।


यह वास्तव में एक समाधान नहीं है। यह सिर्फ गलीचा के नीचे गंदगी छिपा रहा है। लेकिन वैसे भी अच्छा लगता है। इसे विकास प्रक्रिया के दौरान मदद करनी चाहिए, लेकिन यह समस्या को दूर नहीं करता है।
मारियस

मुझे सही करने के लिए धन्यवाद मारियस। मुझे अपनी अधिकांश परियोजना में एक ही मामला मिला है और इससे मुझे इसे हल करने में मदद मिली है।
रवि यदव

@ मार्स, क्या आप यह समझाने की परवाह करेंगे कि, और लोगों को समस्या को हल करने के लिए सबसे अधिक विहित विधि की जानकारी क्यों है?
chrBrd

-1

सीजीआई का उपयोग करके मैगनेटो को अपग्रेड करने की कोशिश करें, क्योंकि मैंने सत्र और ऐप के लिए 'एरिया कोड डिफाइन नहीं' किया है। vendor/magento/framework/App/State.php फ़ाइल और यह काम कर रहा है।

public function __construct(
    \Magento\Framework\Config\ScopeInterface $configScope,
    $mode = self::MODE_DEFAULT
) {
    $this->_areaCode = Area::AREA_GLOBAL;
    $this->_configScope = $configScope;
    switch ($mode) {
        ...
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.