Saya menerima galat berikut saat memperbarui data melalui 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
Berikut ini adalah di.xml
file saya
<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>
Jawaban:
Area tidak diatur dalam Magento CLI (tidak diperlukan untuk perintah inti apa pun). Itu dapat diatur di awal
execute
metode perintah Anda :sumber
admin
atauadminhtml
) - ada kesalahan:Area code already set
. Tetapi kemudian, jika saya berkomentar, ada pengecualian dari subjek lagi.\Magento\Framework\App\Area::AREA_*
konstanta alih-alih string hardcodedbin/magento
semua konstruktor dieksekusi, dan jika kode area dicoba untuk ditetapkan 2 kali pengecualian dilemparkan. Lebih baik mengatur kode area diexecute()
-metode Anda , atau menjalankan kode Anda di emulasi store- atau area jika diperlukan. Juga: dependensi konstruktor yang dapat memicu sesi ke bawah rantai harus diinisialisasi menggunakan pabrik atau proxy untuk mencegah dependensi dari pengaturan kode area.Saya telah menemukan masalah ini lagi hari ini dan penting untuk mengetahui bahwa masalah ini dilemparkan setiap kali ketergantungan pada rantai memulai sebuah contoh yang perlu mengetahui keadaan aplikasi.
Dalam banyak kasus kesalahan ini terikat pada sesi (karena sesi perlu mengetahui keadaan aplikasi (frontend atau adminhtml)).
Dalam kasus saya, saya perlu memiliki
Magento\Tax\Api\TaxCalculationInterface
perintah CLI, tetapi ini memerlukan pada beberapa titik dalam rantai ketergantungan sesi pelanggan (mungkin untuk mendapatkan kelompok pelanggan).Sunting: Saya menemukan solusi yang lebih baik menggunakan proxy. Tapi demi sejarah, inilah jawaban saya sebelumnya:
Untuk mengatasi ini saya tidak menyertakan antarmuka ini dalam konstruktor saya, tetapi ini adalah pabrik:
Dengan cara ini, kelas hanya dipakai di satu metode di mana saya membutuhkannya, dan tidak lagi di konstruktor:
Ini memecahkan masalah bagi saya dalam kasus khusus ini.
Dan sekarang jawabannya menggunakan proxy:
Jika Anda tidak ingin memicu semua dependensi ke rantai, Anda harus menggunakan proxy di konstruktor Anda. Menurut dokumentasi asli :
dan:
Jadi dalam situasi saya, dengan
TaxCalculationInterface
, yang harus saya lakukan adalah membuat perhitungan pajak saya sebagai proksi dalam konstruktor saya:Dengan cara ini, kelas saya dimuat dengan malas. Yaitu: itu hanya dipakai segera setelah saya memanggil salah satu metode itu. Sebagai contoh:
sumber
Anda tidak harus menggunakan
setAreaCode
dalam__construct
untuk perintah CLI. Saat Anda menjalankan perintah apa pun, Magento mengumpulkan dan membuat instance untuk setiap skrip yang terdaftar dalam aplikasi Anda. Jika ada lebih dari satu__construct
dengan definisi kode area Anda akan memiliki kesalahan.Saya kira lebih baik menggunakan
execute()
metode untuk mengatur kode area. Periksa modul katalog:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
sumber
bin/magento
semua konstruktor dieksekusi, dan jika kode area dicoba untuk ditetapkan 2 kali pengecualian dilemparkan. Lebih baik mengatur kode area diexecute()
-metode Anda , atau menjalankan kode Anda di emulasi store- atau area jika diperlukan. Juga: dependensi konstruktor yang dapat memicu sesi ke bawah rantai harus diinisialisasi menggunakan pabrik atau proxy untuk mencegah dependensi dari pengaturan kode area.untuk masalah areaCode ini, jika parameter 'frontend' tidak berfungsi, coba:
bekerja untuk saya, semoga membantu
sumber
try { $this->_state->... } finally { $this->executeMyCommand() }
Dalam kebanyakan kasus pengecualian disebabkan oleh beberapa tindakan yang dilakukan dalam perintah konsol. Solusi (alih-alih mengatur kode area) adalah meniru kode area dan melakukan tindakan menggunakan
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
dimana
$state
objekMagento\Framework\App\State
. Pengaturan area di tempat yang berbeda adalah masalah, karena dapat menyebabkan konflik antar panggilan.sumber
Masalahnya adalah ia tidak memiliki metode apa pun yang mengembalikan false jika variabel area_code belum disetel. Cara saya menemukannya untuk dipecahkan adalah dengan membuat override dari kelas negara dan membuat metode baru untuk memvalidasi jika area_code disetel.
Di file saya di.xml
Buat file Webjump \ Abacos \ App \ State
Menggunakan
sumber
Di magento 2 jika Anda mengatur AreadCode tetapi masih mendapatkan kesalahan ini, silakan coba kode berikut.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
sumber
Saya menderita kesalahan 'Kode area tidak disetel' berjalan
bin/magento setup:upgrade
setelah mengimpor basis data dari produksi. Ini kasus yang sedikit berbeda dari subjek topik ini, tetapi mungkin akan membantu seseorang. Saya dapat menyelesaikan masalah ini secara lokalbin/magento deploy:mode:set developer
meskipun saya sudah dalam mode pengembang. Magento melakukan beberapa penyesuaian konfigurasi, khusus untuk saya peran debug_logging.sumber
Saya mendapatkan solusinya dengan menggunakan kelas proxy. Contohnya adalah
Ini memperbaiki masalah saya
sumber
Saya telah menemukan masalah yang sama dengan kode Area saat menyiapkan peningkatan.
Saya telah menonaktifkan semua modul pihak ketiga dan menjalankan
setup:upgrade
Kemudian saya telah mengaktifkan kembali semua modul pihak ketiga dan menjalankan perintah yang sama. Masalah terpecahkan untuk saya. Semoga ini bisa membantu Anda.
sumber
Cobalah untuk meningkatkan magento menggunakan CLI daripada yang saya temukan 'kode area tidak mendefinisikan' untuk sesi & aplikasi
vendor/magento/framework/App/State.php
.sumber