Наконец-то я нашел решение этой проблемы на форумах сообщества Magento, предоставленных @ dunagan5887 . Я решил поделиться этим здесь, на magento.stackexchange.com, так как многие могут извлечь пользу из хорошо отрекомендованного решения этого исключения.
Существует ссылка на оригинальное сообщение форума сообщества: Шаблон электронной почты с блоком
Похоже, это решение, цитируемое @ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.
Решение состоит из этой простой строки кода:
$ Это -> _ objectManager-> Configure ($ это -> _ configLoader-> нагрузки ( 'adminhtml'));
Пожалуйста, найдите рабочую версию класса командной строки ниже:
Приложение / код / 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 мы поняли, что это правильный метод для установки области:
Приложение / код / 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 \ Area
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';
...