Нарешті я знайшов рішення цієї проблеми на форумах спільноти Magento, які надав @ 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-> configure ($ this -> _ configLoader-> load ('adminhtml'));
Нижче знайдіть клас командного рядка робочої версії:
app / code / NameSpace / Модуль / 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();
}
...
}
Просто змініть область з 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 / code / NameSpace / Модуль / 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
...
}
...
}
Зауважте, що ми не використовуємо диспетчер об'єктів і що область повинна бути встановлена в межах функції, яка вимагає цього, а НЕ в конструкторі. Це офіційний спосіб встановлення області, і він повинен бездоганно працювати з усіма версіями Magento 2.
Список доступних областей доступний у наступному класі:
Magento \ 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';
...