Magento2-명령 줄-블록 템플릿을 사용하여 이메일 보내기-오류 : 필수 인수 $ debugHintsPath가 없습니다.


11

커맨드 라인에서 Magento 2로 이메일을 보내려고 할 때 아래 예외가 발생했습니다. 프론트 엔드 또는 백엔드 컨트롤러에서 이메일을 보내기 위해 동일한 클래스를 사용하는 동안 완벽하게 작동했습니다. 명령 행 인터페이스를 사용하여 문제가 심각하게 발생했습니다.

예외:

main.CRITICAL : 'Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints의 $ debugHintsPath 인수가 누락되었습니다'라는 메시지가있는 'BadMethodCallException'예외가 발생했습니다. /.../.../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 Community Forums에서이 문제에 대한 해결책을 찾았 습니다 . 많은 사람들 이이 예외에 대한 잘 알려진 솔루션의 이점을 누릴 수 있으므로 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]

올바른 방법 :

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 버전에서 완벽하게 작동합니다.


사용 가능한 영역 목록은 다음 클래스에서 사용할 수 있습니다.

마 젠토 \ 프레임 워크 \ 앱 \ 영역

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 감사합니다. 내 하루를 구해줘 :) 다시 한 번 감사드립니다
Ankit Shah

나는 범위를 글로벌로 설정하고 잘 작동합니다.
Rakesh Jesadiya

1
경고 : $objectManager->configure($configLoader->load('frontend'));클래스 생성자에서 해당 코드 ( )를 사용하지 마십시오 ! 현재 영역과 다른 영역에서 구성을로드하고로드하면 Magento 2가 심각하게 손상 될 수 있습니다!
Wesley Vestjens

@Wesley Vestjens +1 의견을 보내 주셔서 감사합니다. 올바른 방법은 실제로 매우 다르며이를 반영하도록 답변을 업데이트했습니다. [업데이트 -2]를 참조하십시오 .
ElGatito

실제로 Magento 2의보기 레이어 일부 (Magento 2에서 PDF 파일 생성에 필요)를 사용하는 경우 영역 설정만으로는 작동하지 않습니다. 변수가 설정되지 Magento\Developer\Model\TemplateEngine\Plugin\DebugHints않았기 때문에 다음 객체에 대한 오류가 발생 debugHintsPath합니다. 원래 코드를 사용하여 ADMINHTML 영역을로드하면 DI 구성이 작동하거나 debugHintsPath변수를 수동으로 설정해도 작동하지만 다른 깨진 부분이있을 수 있습니다. CLI에서 뷰 레이어 요소를 사용할 수 없기 때문에 이것은 실제로 Magento의 "버그"입니다.
Wesley Vestjens

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.