Magento 2: exceção do observador de eventos não aparece na tela

8

Na extensão personalizada, crio um observador como este.

app\code\Vendor\Extension\etc\frontend\events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_quote_remove_item">
    <observer name="sales_quote_remove_item_handler" instance="Vendor\Extension\Observer\RemovecartbeforeObserver" shared="false" />
  </event>
</config>

E meu observador:

app\code\Vendor\Extension\Observer\RemovecartbeforeObserver.php

use Magento\Framework\Event\ObserverInterface;

class RemovecartbeforeObserver implements ObserverInterface
{
   public function execute(\Magento\Framework\Event\Observer $observer)
   {
       // HERE IS MY CODE
       $message = "THIS IS CUSTOM ERROR MESSAGE";
       throw new \Magento\Framework\Exception\LocalizedException(__($message));
       return;
    }
 }

A função My Observer é chamada, mas não mostra erro personalizado na página. Nesse caso, ele mostra minha mensagem em um exception.logarquivo como este.

main.CRITICAL: exception 'Magento\Framework\Exception\LocalizedException' with message 'THIS IS CUSTOM ERROR MESSAGE' in E:\xampp\htdocs\myworks\magento213\app\code\Vendor\Extension\Observer\RemovecartbeforeObserver.php:106 

Veja como ele mostra a mensagem padrão. insira a descrição da imagem aqui

Dhiren Vasoya
fonte
Como era a sua página quando o observador foi executado?
Rendy Eko Prastiyo
Ele mostra a mensagem padrão "Não podemos remover o item". instância de mensagem personalizada. Atualizo a verificação de perguntas agora.
Dhiren Vasoya
Tem certeza de que o pensamento que deseja executar foi executado? Como depurar: tente enviar a saída para o navegador Hello Nasty World!e adicione exitpara sair da execução do código acima da $message = 'blablabla'linha. Se você vir a mensagem, poderá ir para a próxima etapa. Experimente e deixe-me agora se o Hello Nasty World!é enviado para o navegador.
Rendy Eko Prastiyo
Sim, se eu colocar a saída ao lado, ela mostrará uma mensagem na tela. Se você quiser, eu forneci o tipo de tela.
Dhiren Vasoya
Que mensagem você viu? O Hello nasty Worldou We can't remove the item!ou algo mais? Forneça também a captura de tela.
Rendy Eko Prastiyo

Respostas:

11

Eu pesquiso mais algumas coisas sobre isso e finalmente encontrei minha solução,

Eu preciso apenas mudar o código do observador assim.

app\code\Vendor\Extension\Observer\RemovecartbeforeObserver.php

use Magento\Framework\Event\ObserverInterface;

class RemovecartbeforeObserver implements ObserverInterface
{
   protected $messageManager;
   protected $_responseFactory;
   protected $_url;

    public function __construct(\Magento\Framework\Message\ManagerInterface $messageManager,
    \Magento\Framework\App\ResponseFactory $responseFactory,
    \Magento\Framework\UrlInterface $url)
   {
       $this->messageManager = $messageManager;
       $this->_responseFactory = $responseFactory;
       $this->_url = $url;
   }

   public function execute(\Magento\Framework\Event\Observer $observer)
   {
       // HERE IS MY CODE
       $message = "THIS IS CUSTOM ERROR MESSAGE";
       $this->messageManager->addError($message);
       $cartUrl = $this->_url->getUrl('checkout/cart/index');
       $this->_responseFactory->create()->setRedirect($cartUrl)->sendResponse();            
       exit;
    }
 }
Dhiren Vasoya
fonte
Não funciona no meu final não sei por que :)
Surender SINGH
resposta perfeita !!! fez o meu dia. 1)
SagarPPanchal
Mensagem de erro não mostrando se carrinho está vazio ..
Jafar pinjar
@jafarpinjar o que você está tentando fazer?
Dhiren Vasoya 12/07/19
@ DhirenVasoya, desculpe seu trabalho para mim
Jafar pinjar
4

Atualize sua classe para ficar assim:

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Message\ManagerInterface as MessageManagerInterface;
use Magento\Framework\Controller\Result\RedirectFactory;

class RemovecartbeforeObserver implements ObserverInterface
{
    protected $messageManager;
    protected $redirectFactory;

    public function __construct(
        MessageManagerInterface $messageManager,
        RedirectFactory $redirectFactory
    ) {
        $this->messageManager = $messageManager;
        $this->redirectFactory = $redirectFactory;
    }

    public function execute(Observer $observer)
    {
        $observer->getRequest()->setParam('item', false);

        $message = "THIS IS CUSTOM ERROR MESSAGE";
        $this->messageManager->addError($message);

        return $this->redirectFactory->create()->setPath('*/*/');
    }
}
Rendy Eko Prastiyo
fonte
Ele mostra a mensagem na tela, mas ainda assim remove o item do carrinho. O objetivo é que, se o observador gerar o erro, ele não removerá o item do carrinho e mostrará nossa mensagem personalizada na tela.
Dhiren Vasoya
sales_quote_remove_itemé acionado após a remoção de um item. Se você deseja fazer uma verificação antes de remover um item, observe que sales_quote_item_delete_beforenão sales_quote_remove_item. Atualização <event name="sales_quote_remove_item">do seu xml para<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo
ainda a mesma saída. Ele mostra a mensagem, mas remove o item do carrinho.
Dhiren Vasoya
Você limpou e liberou o cache bin/magento cache:clean && bin/magento cache:flushapós atualizar seu xml?
Rendy Eko Prastiyo
sim, eu corro comando
Dhiren Vasoya 7/17/17