ম্যাজেন্টো 2-তে কাস্টম সি এল এল কমান্ডে 'এরিয়া কোড সেট করা নেই' ইস্যু


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>

আপনি কি দয়া করে আপনার কোডটি আরও প্রদর্শন করতে পারেন এবং আপনি যা করার চেষ্টা করছেন সে সম্পর্কে আরও প্রসঙ্গ দিতে পারেন?
নাথান টমবস

আমি একই সমস্যা সম্মুখীন হয়। তবে উপরে দেখানো সমাধানটি আমার পক্ষে কাজ করে না। এটি এখন কয়েক সপ্তাহ ধরে আমাকে বিভ্রান্ত করছে।
স্টিভেনলাভাইন

উত্তর:


63

অঞ্চলটি ম্যাজেন্টো সি এল এলিতে সেট করা নেই (এটি কোনও কোর কমান্ডের প্রয়োজন হয় না)। এটি আপনার কমান্ডের 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
এফওয়াইআই, আপনি "প্রশাসনিক" আমার পক্ষে কাজ করছেন না। "অ্যাডমিন" কাজ করেছে।
ফিনিক্স 128_ রিকার্ডোটি

আমার জন্য এটা কাজ করে না ( adminবা adminhtml) - একটি ত্রুটি হল: Area code already set। তবে তারপরে আমি যদি এটি মন্তব্য করি তবে বিষয় থেকে আবার ব্যতিক্রম রয়েছে।
বার্তোস্জ কুবিকি

13
আপনার \Magento\Framework\App\Area::AREA_*হার্ডকোডযুক্ত স্ট্রিংগুলির পরিবর্তে ধ্রুবকগুলি ব্যবহার করা উচিত
শে

3
আপনার কনস্ট্রাক্টরে অঞ্চল কোড সেট না করা ভাল; যখনই আপনি চালান bin/magento সমস্ত কনস্ট্রাক্টর মৃত্যুদন্ড কার্যকর করা হয় এবং যদি অঞ্চল কোডটি 2 বার সেট করার চেষ্টা করা হয় তবে একটি ব্যতিক্রম নিক্ষেপ করা হয়। আপনার- execute()আদর্শে অঞ্চল কোডটি সেট করা ভাল , বা স্টোরে আপনার কোড চালানো ভাল- বা রাষ্ট্রের প্রয়োজন হলে অঞ্চল অনুকরণ। এছাড়াও: কনস্ট্রাক্টর নির্ভরতাগুলি যে শৃঙ্খলে সেশনটি ট্রিগার করতে পারে কোনও অঞ্চল কোড সেট করা থেকে নির্ভরতা রোধ করতে কারখানা বা প্রক্সি ব্যবহার করে সূচনা করা উচিত।
জিল বার্কার্স

1
দয়া করে এটি সঠিক উত্তর হিসাবে আনসেট করুন। যখন আমরা কনস্ট্রাক্টরে এরিয়া কোড সেট করি তখন এটি ব্যতিক্রম তৈরি করে।
সন্দিপন এস

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

আপনি ব্যবহার করা উচিত নয় setAreaCodeমধ্যে __constructCLI কমান্ড জন্য। আপনি যখন কোনও কমান্ড চালান তখন ম্যাগেন্টো আপনার আবেদনে নিবন্ধিত প্রতিটি স্ক্রিপ্টের জন্য সংগ্রহ সংগ্রহ করে উদাহরণ তৈরি করে। __constructঅঞ্চল কোড সংজ্ঞা সহ যদি একাধিক থাকে তবে আপনার ত্রুটি হবে।

আমি execute()অঞ্চল কোড সেট করার জন্য পদ্ধতিটি আরও ভালভাবে মনে করি । ক্যাটালগ মডিউলটি পরীক্ষা করুন: vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php


1
আমার কাছে যৌক্তিক. অন্য কেউ এই মন্তব্য করতে চান?
ermannob

এটি সঠিক, স্বীকৃত উত্তরে আমার মন্তব্যটিও দেখুন: আপনার কনস্ট্রাক্টরে অঞ্চল কোডটি সেট না করা ভাল; যখনই আপনি চালান bin/magento সমস্ত কনস্ট্রাক্টর মৃত্যুদন্ড কার্যকর করা হয় এবং যদি অঞ্চল কোডটি 2 বার সেট করার চেষ্টা করা হয় তবে একটি ব্যতিক্রম নিক্ষেপ করা হয়। আপনার- execute()আদর্শে অঞ্চল কোডটি সেট করা ভাল , বা স্টোরে আপনার কোড চালানো ভাল- বা রাষ্ট্রের প্রয়োজন হলে অঞ্চল অনুকরণ। এছাড়াও: কনস্ট্রাক্টর নির্ভরতাগুলি যে শৃঙ্খলে সেশনটি ট্রিগার করতে পারে কোনও অঞ্চল কোড সেট করা থেকে নির্ভরতা রোধ করতে কারখানা বা প্রক্সি ব্যবহার করে সূচনা করা উচিত।
জিল বার্কার্স

তবে ম্যাজেন্টো ২.২-তে ইনজেকশন \ ম্যাজেন্টো les বিক্রয় \ এপি \ ডেটা \ অর্ডার ইন্টারফেস বা \ ম্যাজেন্টো \ বিক্রয় \ এপি \ অর্ডারম্যানেজমেন্টইন্টারফেস ইন কমান্ড ক্লাস কন্ট্রাক্টসগুলিকে ম্যাগেন্টো \ ফ্রেমওয়ার্ক \ সেশন \ সেশন ম্যানেজার -> const কনস্ট্রাক্ট এরিয়া (শেষ হবে না) বলা হবে সেট "। এটি ঘটে না 2.1। কারণ মডিউল-ইউআই / কনফিগার / রিডার / সংজ্ঞা / ডেটা ২.২-তে প্রবর্তিত হয়েছে আমরা কীভাবে এটি সমাধান করব?
ডনি উইবোও

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

সমস্যাটি হ'ল এটির এমন কোনও পদ্ধতি নেই যা ভেরিয়েবল_র কোডটি সেট না করা থাকলে মিথ্যা ফেরত দেয়। সমাধানের জন্য আমি যেভাবে এটি খুঁজে পেয়েছি তা হ'ল রাজ্য শ্রেণীর ওভাররাইড তৈরি করা এবং অঞ্চল_কোড সেট করা থাকলে যাচাই করার জন্য একটি নতুন পদ্ধতি তৈরি করা।

আমার ফাইল di.xML এ

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

Webjump Create Abacos \ অ্যাপ \ স্টেট ফাইল তৈরি করুন

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');
  • $ State-> setAreaCode ( 'বিশ্বব্যাপী');

0

bin/magento setup:upgradeউত্পাদন থেকে আমদানি করা ডাটাবেসের পরে চলতে গিয়ে 'এরিয়া কোড সেট করা হয় না' আমি ত্রুটির সাথে ভুগছিলাম। এটি এই বিষয়টির চেয়ে কিছুটা আলাদা কেস, তবে সম্ভবত কাউকে সহায়তা করবে। আমি bin/magento deploy:mode:set developerইতিমধ্যে বিকাশকারী মোডে থাকা সত্ত্বেও স্থানীয়ভাবে চলমান এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি। ম্যাজেন্টো কিছু কনফিগারেশন সামঞ্জস্য করেছে, বিশেষ করে আমার জন্য ডিবাগ_লগিংয়ের ভূমিকা পালন করেছে।


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

সেশন এবং অ্যাপ্লিকেশনটির জন্য আমি 'এরিয়া কোডটি সংজ্ঞায়িত করি না' এর চেয়ে সিএলআই ব্যবহার করে ম্যাজেন্টো আপগ্রেড করার চেষ্টা করুন B তবে কোন মডিউল বা থিম খুঁজে পাচ্ছি না so সুতরাং আমি কেবল 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) {
        ...
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.