ในที่สุดผมก็พบว่าวิธีการแก้ปัญหานี้ในฟอรั่มวีโอไอพีของชุมชนซึ่งถูกจัดให้โดย@ dunagan5887 ฉันตัดสินใจที่จะแบ่งปันได้ที่นี่ในmagento.stackexchange.comหลายคนอาจได้รับประโยชน์จากวิธีแก้ปัญหาที่มีการอ้างอิงถึงข้อยกเว้นนี้
มีลิงก์ไปยังโพสต์ฟอรัมชุมชนดั้งเดิม: เทมเพลตอีเมลพร้อมบล็อก
ดูเหมือนว่าโซลูชั่นนี้ตามที่ยกมาโดย@ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.
โซลูชันประกอบด้วยบรรทัดของรหัสง่าย ๆ นี้:
$ this -> _ objectManager-> กำหนดค่า ($ นี้ -> _ configLoader-> โหลด ( 'adminhtml'));
โปรดหาคลาสบรรทัดคำสั่งที่ใช้งานได้ด้านล่าง:
app / รหัส / NameSpace / โมดูล / คอนโซล / Command.php
<?php
namespace NameSpace\Module\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Magento\Framework\Exception\LocalizedException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CustomCommandClass extends Command
{
public function __construct(
\Magento\Framework\App\State $state,
\Magento\Framework\ObjectManagerInterface $objectManager,
\Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader
) {
$state->setAreaCode('frontend'); //SET CURRENT AREA
$objectManager->configure($configLoader->load('frontend')); //SOLUTION
parent::__construct();
}
...
}
เพียงเปลี่ยนพื้นที่จากfrontend
เป็นadmin
หรือglobal
ตามที่แอปพลิเคชันของคุณต้องการ
[อัปเดต]
พื้นที่adminhtml
ทำให้เกิดข้อผิดพลาดในการปรับใช้เนื้อหาแบบคงที่
ดูเหมือนว่าด้วยเหตุผลบางประการการตั้งค่าพื้นที่adminhtml
เป็นสาเหตุของข้อผิดพลาดบางอย่างในขณะที่ปรับใช้เนื้อหาแบบคงที่
เราพบข้อผิดพลาดดังนี้:
Fatal error: Uncaught Exception: Warning: Error while sending QUERY packet. PID=22912 in ../magento/vendor/magento/zendframework1/library/Zend/Db/Statement/Pdo.php on line 228 in ../magento/vendor/magento/framework/App/ErrorHandler.php:61
ตอนแรกฉันคิดว่าข้อผิดพลาดนี้อาจเกิดจากการmax_allowed_packet
ตั้งค่าที่ต่ำสำหรับ MYSQL แต่เนื่องจากขีด จำกัด นั้นสูงพอและการเพิ่มขึ้นจึงไม่สามารถแก้ไขปัญหาได้ฉันจึงตัดสินใจขุดต่อไป หลังจากผ่านกระบวนการกำจัดในที่สุดฉันก็พบว่านี่เป็นความแตกต่างหลักระหว่างสองโมดูลโดยใช้ฟังก์ชั่นคำสั่งที่คล้ายกันซึ่งหนึ่งในโมดูลนั้นเป็นสาเหตุของปัญหานี้ทันทีที่เปิดใช้งาน
แม้ว่าฉันจะไม่ได้ขุดหาแหล่งที่มาของปัญหาหรือความขัดแย้งนี้ฉันคิดว่ามันเป็นความคิดที่ดีที่จะแบ่งปันสิ่งที่ฉันค้นพบที่นี่เนื่องจากคนอื่น ๆ อาจพบว่ามีประโยชน์
[อัปเดต - 2]
วิธีการที่เหมาะสม:
หลังจากอัพเกรด Magento เป็น 2.2.X เราได้ตระหนักว่านี่เป็นวิธีที่เหมาะสมสำหรับการตั้งค่าพื้นที่:
app / รหัส / NameSpace / โมดูล / คอนโซล / Command.php
<?php
namespace NameSpace\Module\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Magento\Framework\Exception\LocalizedException;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CustomCommandClass extends Command
{
public function __construct(
\Magento\Framework\App\State $state,
) {
$this->_appState = $appState;
parent::__construct();
}
...
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->_appState->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL); //SET CURRENT AREA
...
}
...
}
โปรดทราบว่าเราไม่ได้ใช้ประโยชน์จาก Object Manager และต้องตั้งค่าพื้นที่ภายในฟังก์ชั่นที่ต้องการไม่ใช่ในตัวสร้าง นี่เป็นวิธีที่เป็นทางการของการตั้งค่าพื้นที่และควรทำงานได้อย่างไม่มีที่ติกับ Magento 2 ทุกรุ่น
รายการของพื้นที่ที่มีอยู่มีอยู่ในคลาสต่อไปนี้:
วีโอไอพี \ Framework \ App \ พื้นที่
class Area implements \Magento\Framework\App\AreaInterface
{
const AREA_GLOBAL = 'global';
const AREA_FRONTEND = 'frontend';
const AREA_ADMIN = 'admin';
const AREA_ADMINHTML = 'adminhtml';
const AREA_DOC = 'doc';
const AREA_CRONTAB = 'crontab';
const AREA_WEBAPI_REST = 'webapi_rest';
const AREA_WEBAPI_SOAP = 'webapi_soap';
...