Magento2-コマンドライン-ブロックテンプレートを使用してメールを送信-エラー:必要な引数がありません$ debugHintsPath


11

Magento 2でコマンドラインからメールを送信しようとすると、以下の例外が発生しました。まったく同じクラスを使用してフロントエンドまたはバックエンドのコントローラーからメールを送信している間、完全に機能していました。この問題は、コマンドラインインターフェースを使用して厳密に発生していました。

例外:

main.CRITICAL:例外「BadMethodCallException」とメッセージ「Missing required argument $ debugHintsPath of Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints。」/.../.../magento/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:45内

この問題は、テンプレート内からレイアウトを介してブロックを呼び出そうとしたときにのみ発生していました。ブロック呼び出しが削除されるとすぐに、例外は表示されなくなりました。

テンプレートファイル:

app / code / NameSpace / Module / view / frontend / email / email_notification.html

{{template config_path="design/email/header_template"}}

...

<!-- THIS LINE CAUSED THE EXCEPTION TO SHOW UP -->
{{layout handle="sales_email_order_items" order=$order area="frontend"}}

...

{{template config_path="design/email/footer_template"}}

メールは件名がそのままの状態で送信されましたが、コンテンツ全体がレンダリングされず、メールが受信されるとコンテンツセクションに以下のエラーのみが表示されました。

メール内に印刷されたエラー:

エラーフィルタリングテンプレート:Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHintsの必須引数$ debugHintsPathがありません。

回答:


16

この問題の解決策は、@ 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();
    }

    ...

}

領域をからfrontendadminまたは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_packetMYSQLの設定が低いことが原因であると考えていましたが、制限がすでに十分に高く、問題を解決することができなかったため、さらに調査することにしました。除去プロセスを行った後、これは最終的に、類似のコマンド機能を使用する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';

    ...

@ElGatitoに感謝します。Uは私の日を保存します。:)ログを再度ありがとう
Ankit Shah

私はスコープをグローバルに設定し、それでうまくいきました。
ラケッシュJesadiya

1
警告:$objectManager->configure($configLoader->load('frontend'));クラスのコンストラクタでそのコード()を使用しないでください!現在のエリアとは異なるエリアから設定を読み込んでロードすると、Magento 2に深刻な影響を与える可能性があります!
Wesley Vestjens 2018

@Wesley Vestjens +1コメントありがとうございます。正しい方法は実際には非常に異なり、私はそれを反映するために私の答えを更新しました。[UPDATE-2]を参照してください。
ElGatito

実際、Magento 2のビューレイヤー(Magento 2でPDFファイルを生成するために必要)の一部を使用している場合は、単に領域を設定するだけでは機能しません。次のオブジェクトに関してエラーが発生します。変数が設定されていないMagento\Developer\Model\TemplateEngine\Plugin\DebugHintsためdebugHintsPathです。元のコードを使用してADMINHTMLエリアのDI構成をロードするか、debugHintsPath変数を手動で設定すると機能しますが、他の壊れた部分がある可能性があります。CLIではビューレイヤー要素を使用できないため、これは実際にはMagentoの「バグ」です。
Wesley Vestjens、2018

6

MagentoのCLIには適切な領域がないため、次の回避策を見つけました。

app / code / NameSpace / Module / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <!-- Add this for sending email via cli -->
    <type name="Magento\Developer\Model\TemplateEngine\Plugin\DebugHints">
        <arguments>
            <argument name="debugHintsPath" xsi:type="string">dev/debug/template_hints_storefront</argument>
        </arguments>
    </type>
</config>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.