Magento 2'deki özel CLI komutlarında 'Alan kodu ayarlanmadı' sorunu


46

Verileri güncellerken hatayı takip ediyorum 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                              

Aşağıdaki benim di.xmldosyam

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

Lütfen kodunuzun daha fazlasını gösterip ne yapmaya çalıştığınızla ilgili daha fazla içerik verebilir misiniz?
Nathan Toombs

Aynı sorunla karşılaşıyorum. Ancak yukarıda gösterilen çözüm benim için çalışmıyor. Bu beni haftalardır şaşırtıyor.
Stevenlavine

Yanıtlar:


63

Alan Magento CLI'da ayarlanmamış (herhangi bir temel komut için gerekli değil). Komutunuzun executemetodunun başında ayarlanabilir :

/** @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
Bilgin olsun, sen "adminhtml" benim için çalışmıyordu. "admin" çalıştı.
Phoenix128_RiccardoT

Benim için o iş (değil adminya adminhtml) - bir hata var: Area code already set. Ama sonra, eğer yorum yaparsam, yine konudan bir istisna var.
Bartosz Kubicki

13
\Magento\Framework\App\Area::AREA_*Sabit kodlu dizeler yerine sabitleri kullanmanız gerekir
7ochem

3
Alan kodunu yapıcınızda belirlememek en iyisidir; Ne zaman çalıştırsanız, bin/magento tüm kurucular çalıştırılır ve alan kodu 2 defa ayarlanmaya çalışılırsa bir istisna atılır. Alan kodunu execute()-metod'unuzda ayarlamak veya kodunuz depolanıyorsa veya alan emülasyonunda kodunu çalıştırmak en iyisidir. Ayrıca: zincirdeki bir oturumu tetikleyebilecek yapıcı bağımlılıklar, bağımlılıkların bir alan kodu belirlemesini önlemek için bir fabrika veya bir proxy kullanılarak başlatılmalıdır.
Giel Berkers

1
Lütfen doğru cevap olarak ayarlayınız. Yapıcıda alan kodunu ayarladığımızda istisna yaratır.
Sandipan S

33

Bugün yine bu soruna rastladım ve bu sorunun, zincirdeki bir bağımlılık, uygulamanın durumunu bilmesi gereken bir örneği başlattığı zaman atıldığını bilmek önemlidir.

Çoğu durumda bu hata oturuma bağlıdır (oturumun uygulamanın durumunu bilmesi gerektiğinden (frontend veya adminhtml)).

Benim durumumda Magento\Tax\Api\TaxCalculationInterfacebir CLI komutuna ihtiyacım vardı, ancak bu bir noktada müşteri oturumunun bağımlılık zincirinde (muhtemelen müşteri grubunu elde etmek için) ihtiyaç duyuyor.

Düzenleme: Proxy'ler kullanarak daha iyi bir çözüm buldum. Ama tarihin iyiliği için önceki cevabım:


Bunu çözmek için yapıcıma bu arayüzü dahil etmedim, aksine fabrika:

/**
 * @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
 */
protected $taxCalculationFactory;

/**
 * @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
 */
public function __construct(
    \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
    $this->taxCalculationFactory = $taxCalculationFactory;
}

Bu şekilde, sınıf sadece ihtiyacım olan bir yöntemde somutlaştırılır ve artık yapıcıda:

$taxCalculation = $this->taxCalculationFactory->create();

Bu, bu özel durumda benim için sorunu çözdü.


Ve şimdi bir proxy kullanarak cevap:

Zincirdeki tüm bağımlılıkları tetiklemek istemiyorsanız, kurucunuzda bir proxy kullanmalısınız. Göre orijinal belgeler :

... yapıcı enjeksiyon, aynı zamanda, bir nesne oluşturduğunuzda, nesne başlatmanın zincirleme reaksiyonunun sıklıkla sonuç olduğu anlamına gelir.

ve:

... Proxy'ler, diğer sınıfları tembel yüklü sürümleri haline getirir. Yani, sınıfın metodlarından birinin gerçekte çağrılmasından sonra yaratılan proxy sınıfının gerçek bir örneğidir.

Yani benim durumumda TaxCalculationInterface, tek yapmam gereken, vergi hesaplamamı kurucumda bir vekil olarak başlatmaktı:

/**
 * @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;
}

Bu şekilde, sınıfım tembel yüklü. Şöyle ki: Ben sadece onun yöntemlerinden birini çağırdığımda başlatılır. Örneğin:

$rate = $this->taxCalculation->getCalculatedRate($productRateId);

17

Sen kullanmamalısınız setAreaCodeiçinde __constructCLI komutlar için. Herhangi bir komutu çalıştırdığınızda, Magento, uygulamanızda kayıtlı her bir komut dosyası için örnek toplar ve oluşturur. __constructAlan kodu tanımına sahip birden fazla varsa, hatayı alırsınız.

execute()Alan kodunu ayarlamak için yöntemi kullanmanın daha iyi olduğunu varsayalım . Katalog modülünü kontrol edin: vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php


1
Bana mantıklı geldi. Başka biri bu konuda yorum eklemek ister mi?
ermannob

Bu doğru, ayrıca kabul edilen cevap hakkındaki yorumuma da bakınız: Alan kodunu kurucunuzda ayarlamamak en iyisidir; Ne zaman çalıştırsanız, bin/magento tüm kurucular çalıştırılır ve alan kodu 2 defa ayarlanmaya çalışılırsa bir istisna atılır. Alan kodunu execute()-metod'unuzda ayarlamak veya kodunuz depolanıyorsa veya alan emülasyonunda kodunu çalıştırmak en iyisidir. Ayrıca: zincirdeki bir oturumu tetikleyebilecek yapıcı bağımlılıklar, bağımlılıkların bir alan kodu belirlemesini önlemek için bir fabrika veya bir proxy kullanılarak başlatılmalıdır.
Giel Berkers

ancak Magento 2.2'de, komut sınıfındaki yapılara \ Magento \ Sales \ Api \ Data \ OrderInterface veya \ Magento \ Sales \ Api \ OrderManagementInterface enjekte etmek Magento \ Framework \ Session \ SessionManager -> __ construct () işlevini çağırır ve bitmez "alanı Ayarlamak". Bu olmaz 2.1. modül-ui / Config / Okuyucu / Tanım / Veri 2.2'de tanıtıldığı için bunu nasıl çözeriz?
Doni Wibowo

4

bu areaCode sorunu için 'frontend' parametresi çalışmıyorsa, şunu deneyin:

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

benim için çalışıyordu, umarım yardım eder


Bu kodu hangi dosyaya eklemeliyim? Ben de tamamen aynı problemim var.
Magento Öğrenen

@xxx Özel bir komuttan bu sorunu yaşadım, bu yüzden oluşturduğum komut dosyasına bunu yazdım. Bunu, yürütme işlevine şunun gibi bir şeyle ekleyebilirsiniz:try { $this->_state->... } finally { $this->executeMyCommand() }
DependencyHell

4

Çoğu durumda istisna, konsol komutunda gerçekleştirilen bazı işlemlerden kaynaklanır. Çözüm (alan kodunu ayarlamak yerine) alan kodunu taklit etmek ve

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

$statenesnesi nerede Magento\Framework\App\State? Alanın farklı bir yerde ayarlanması bir problemdir, çünkü çağrılar arasında çatışmaya neden olabilir.


Bu referansı kullanıyorum ve benzer hatayı alıyorum Alan kodu zaten kontrol cihazımda ayarlanmış, lütfen bundan kurtulmama yardım eder misiniz? Yapı fonksiyonumda setareacode çağırma fakat aynı hatayı alma gibi değişiklikler yaptım.
Gagan


1

Sorun, eğer alan_kodu değişkeni ayarlanmadıysa false döndüren herhangi bir yönteme sahip olmamasıdır. Çözmeyi bulduğum yol, devlet sınıfını geçersiz kılmak ve alan_code ayarlanmışsa doğrulamak için yeni bir yöntem oluşturmaktı.

Dosyamda di.xml

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

Dosya oluştur 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;
    }
}

kullanım

/**
* @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

In magento 2 ayarladığınız takdirde AreadCode halde bu hata daha sonra kodu aşağıdakileri deneyin lütfen.

  • kullanım Magento\Framework\App\Bootstrap;
  • Dahil etmek app/bootstrap.php;
  • $ bootstrap = Bootstrap::create(BP, $_SERVER);
  • $ objectManager = $bootstrap->getObjectManager();
  • $ state = $objectManager->get('Magento\Framework\App\State');
  • $ Devlet> setAreaCode ( 'küresel');

0

bin/magento setup:upgradeÜretimden ithalat veritabanından sonra 'Alan kodu ayarlanmadı' hatasıyla karşılaşıyordum . Bu konudan biraz farklı bir durum, ancak belki birilerine yardımcı olabilir. bin/magento deploy:mode:set developerZaten geliştirici modunda olmama rağmen, bu sorunu yerel olarak çalıştırarak çözebildim . Magento bazı ayarlamalar yaptı, özellikle benim için debug_logging rol oynadı.


0

Proxy sınıfını kullanarak çözüm buldum. Örnek

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

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

Bu sorunumu çözdü


-1

Kurulum yükseltme sırasında Alan kodu ile aynı sorunu buldum.

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

Tüm üçüncü parti modüllerini devre dışı bıraktım ve çalıştırdım setup:upgrade

Sonra üçüncü taraf modüllerin hepsini tekrar etkinleştirdim ve aynı komutu kullandım. Sorun benim için çözüldü Umarım bu sizin için yardımcı olur.


bu aslında bir çözüm değil. Sadece halının altındaki kiri gizliyor. Ama yine de iyi bulmak. Geliştirme sürecinde yardımcı olmalıdır, ancak sorunu ortadan kaldırmaz.
Marius

Beni düzelttiğin için Marius teşekkür ederim. Aynı olayı projemin çoğunda buldum ve bu da bunu çözmeme yardımcı oldu.
Ravi yadav

@ Marius, nedenini açıklamaya ve sorunu çözmek için insanlara en kanonik yöntemi bilmelerine izin verir misiniz?
chrBrd

-1

Magli'yi CLI kullanarak yükseltmeye çalışın, oturum ve uygulama için 'alan kodu tanımlanmadı' alanını buldum.Ama hangi modül veya temayı bulamıyorum 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) {
        ...
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.