Magento2 - Linha de Comandos - Enviando email usando modelos de bloco - Erro: Faltando argumento obrigatório $ debugHintsPath

11

Ao tentar enviar emails no Magento 2 a partir da linha de comando, encontrei a exceção abaixo. Ao usar a mesma classe para enviar e-mails de um controlador de front-end ou back-end, estava funcionando perfeitamente. O problema estava acontecendo estritamente usando a interface da linha de comandos.

Exceção:

main.CRITICAL: exceção 'BadMethodCallException' com a mensagem 'Falta argumento obrigatório $ debugHintsPath do Magento \ Developer \ Model \ Template \ TemplateEngine \ Plugin \ DebugHints.' em /.../.../magento/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:45

O problema também estava acontecendo ao tentar chamar um bloco via layout de dentro do modelo. Assim que a chamada em bloco foi removida, a exceção parou de aparecer.

Arquivo de modelo:

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"}}

O email ainda foi enviado com a linha de assunto intacta, mas todo o conteúdo não foi renderizado e apenas o erro abaixo foi exibido na seção de conteúdo após o recebimento do email.

Erro impresso nos emails:

Erro ao filtrar o modelo: Argumento obrigatório ausente $ debugHintsPath do Magento \ Developer \ Model \ TemplateEngine \ Plugin \ DebugHints.

ElGatito
fonte

Respostas:

16

Finalmente encontrei a solução para esse problema nos Fóruns da comunidade Magento, fornecidos por @ dunagan5887 . Decidi compartilhá-lo aqui no magento.stackexchange.com, pois muitos podem se beneficiar de uma solução bem referida para essa exceção.

Há um link para a postagem original do fórum da comunidade: Modelo de email com bloco

Parece que esta solução, conforme citado por @ dunagan5887 ;dictates that the di.xml directive set in vendor/magento/module-developer/etc/adminhtml/di.xml is loaded.

A solução consiste nesta linha de código simples:

$ this -> _ objectManager-> configure ($ this -> _ configLoader-> load ('adminhtml'));


Encontre uma classe de linha de comando da versão funcional abaixo:

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();
    }

    ...

}

Simplesmente altere a área de ou frontendpara a aplicação.adminglobal


[ATUALIZAR]

Área adminhtmlcausando erros de implantação de conteúdo estático

Parece que, por alguns motivos, a configuração da área adminhtmlestá causando alguns erros ao implantar conteúdo estático.

Estávamos vendo erros como os seguintes:

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

Inicialmente, pensei que esse erro seria causado por uma max_allowed_packetconfiguração baixa para o MYSQL, mas como o limite já era alto o suficiente e aumentá-lo não estava resolvendo o problema, decidi ir além. Depois de passar por um processo de eliminação, finalmente descobri que essa era a principal diferença entre dois módulos usando funções de comando semelhantes, das quais um dos módulos estava causando esse problema assim que ativado.

Embora não tenha procurado a fonte desse problema ou conflito, achei que seria uma boa idéia compartilhar minhas descobertas aqui, pois outras pessoas podem achar útil.


[ATUALIZAÇÃO - 2]

O método certo:

Depois de atualizar o Magento para 2.2.X, percebemos que este é o método certo para definir a área:

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

        ...

    }

    ...

}

Observe que não fazemos uso do Gerenciador de objetos e que a área deve ser definida dentro da função que requer isso e NÃO no construtor. Esta é a maneira oficial de definir a área e deve funcionar perfeitamente com todas as versões do Magento 2.


Uma lista das áreas disponíveis está disponível na seguinte classe:

Magento \ Framework \ App \ Área

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
fonte
Muito obrigado @ElGatito. Você salvou meu dia. :) Obrigado log novamente
Ankit Shah
Eu defini o escopo como global e está funcionando bem para mim.
Rakesh Jesadiya
1
AVISO: NÃO use esse código ( $objectManager->configure($configLoader->load('frontend'));) no construtor de uma classe! Se você faz e carrega a configuração de uma área diferente da sua área atual, isso pode quebrar seriamente o Magento 2!
Wesley Vestjens
@Wesley Vestjens +1 Obrigado pelo seu comentário. O método certo é realmente muito diferente e atualizei minha resposta para refleti-lo. Por favor, consulte [ATUALIZAÇÃO - 2] .
ElGatito
Na verdade, apenas definir a área não funcionará se você usar qualquer parte da camada de visualização do Magento 2 (necessária para gerar arquivos PDF no Magento 2). Você receberá um erro em relação ao seguinte objeto: Magento\Developer\Model\TemplateEngine\Plugin\DebugHintsporque a debugHintsPathvariável não está definida. O uso do código original para carregar a configuração DI da área ADMINHTML funciona ou a definição manual da debugHintsPathvariável funciona, mas pode haver outras partes quebradas. Este é realmente um "bug" no Magento, porque não é possível usar os elementos da camada de visualização na CLI.
Wesley Vestjens 15/02/19
6

Como a CLI no Magento não tem uma área apropriada, eu descobri a seguinte solução alternativa:

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>
rut4
fonte