この問題の解決策は、@ 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'));
以下の作業バージョンのコマンドラインクラスを見つけてください。
app / code / 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();
}
...
}
領域をから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つのモジュールの主な違いであり、有効にされるとすぐにモジュールの1つがこの問題を引き起こしていることがわかりました。
私はこの問題または競合の原因を見つけるために掘り下げたわけではありませんが、他の人が役に立つと思うかもしれないので、ここで私の発見を共有することは良い考えだと思いました。
[更新-2]
正しい方法:
Magentoを2.2.Xにアップグレードした後、これが領域を設定する適切な方法であることがわかりました。
app / code / 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
...
}
...
}
オブジェクトマネージャーを使用していないこと、およびエリアはコンストラクターではなく、それを必要とする関数内で設定する必要があることに注意してください。これは領域を設定する公式の方法であり、すべての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';
...