Cuối cùng tôi đã tìm thấy giải pháp cho vấn đề này trong Diễn đàn cộng đồng Magento, được cung cấp bởi @ dunagan5887 . Tôi quyết định chia sẻ nó ở đây trên magento.stackexchange.com vì nhiều người có thể được hưởng lợi từ một giải pháp được giới thiệu tốt cho ngoại lệ này.
Có một liên kết đến bài đăng Diễn đàn cộng đồng gốc: Mẫu email có khối
Có vẻ như giải pháp này, như được trích dẫn bởi @ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.
Giải pháp bao gồm dòng mã đơn giản này:
$ this -> _ objectManager-> configure ($ this -> _ configLoader-> load ('adminhtml'));
Vui lòng tìm một lớp dòng lệnh phiên bản làm việc dưới đây:
ứng dụng / mã / NameSpace / Module / Console / 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();
}
...
}
Chỉ cần thay đổi khu vực từ frontend
đến admin
hoặc global
theo yêu cầu của ứng dụng của bạn.
[CẬP NHẬT]
Khu vực adminhtml
gây ra lỗi triển khai nội dung tĩnh
Dường như vì một số lý do, việc đặt khu vực adminhtml
này gây ra một số lỗi trong khi triển khai nội dung tĩnh.
Chúng tôi đã thấy các lỗi như sau:
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
Ban đầu tôi nghĩ rằng lỗi này sẽ do max_allowed_packet
MYSQL cài đặt thấp nhưng vì giới hạn đã đủ cao và việc nâng cao nó không giải quyết được vấn đề, tôi quyết định đào sâu hơn. Sau khi trải qua quá trình loại bỏ, cuối cùng tôi phát hiện ra rằng đây là điểm khác biệt chính giữa hai mô-đun sử dụng các chức năng lệnh tương tự, từ đó một trong các mô-đun đã gây ra sự cố này ngay khi được bật.
Mặc dù tôi không đào sâu để tìm ra nguồn gốc của vấn đề hoặc xung đột này, tôi nghĩ rằng sẽ là một ý tưởng tốt để chia sẻ những phát hiện của tôi ở đây vì những người khác có thể thấy nó hữu ích.
[CẬP NHẬT - 2]
Phương pháp đúng:
Sau khi nâng cấp Magento lên 2.2.X, chúng tôi nhận ra rằng đây là phương pháp phù hợp để thiết lập khu vực:
ứng dụng / mã / NameSpace / Module / Console / 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
...
}
...
}
Lưu ý rằng chúng tôi không sử dụng Trình quản lý đối tượng và khu vực đó phải được đặt trong hàm yêu cầu và KHÔNG trong hàm tạo. Đây là cách chính thức để thiết lập khu vực và nó sẽ hoạt động hoàn hảo với tất cả các phiên bản Magento 2.
Một danh sách các khu vực có sẵn trong lớp sau:
Magento \ Framework \ Ứng dụng \ Khu vực
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';
...