我终于在@ dunagan5887提供的Magento社区论坛中找到了解决此问题的方法。我决定在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'));
请在下面找到工作版本的命令行类:
应用程序/代码/名称空间/模块/控制台/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之后,我们意识到这是设置区域的正确方法:
应用程序/代码/名称空间/模块/控制台/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';
...