Magento 2: la excepción del observador de eventos no se muestra en la pantalla

8

En extensión personalizada, creo un 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>

Y mi 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;
    }
 }

Se llama a mi función Observador, pero no muestra un error personalizado en la página. Instade esto, muestra mi mensaje en un exception.logarchivo 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 

Vea cómo muestra el mensaje predeterminado. ingrese la descripción de la imagen aquí

Dhiren Vasoya
fuente
¿Cómo se veía tu página cuando el observador fue ejecutado?
Rendy Eko Prastiyo
Muestra el mensaje predeterminado "No podemos eliminar el elemento". instade de mensaje personalizado. Actualizo la comprobación de preguntas ahora.
Dhiren Vasoya
¿Estás seguro de que se ejecuta el pensamiento que quieres ejecutar? Cómo depurar: intente enviar la salida al navegador como Hello Nasty World!y agregue exitpara salir de la ejecución del código sobre la $message = 'blablabla'línea. Si ve el mensaje, puede ir al siguiente paso. Pruébalo y déjame ahora si Hello Nasty World!se envía al navegador.
Rendy Eko Prastiyo
Sí, si pongo salir al lado, muestra el mensaje en la pantalla. Si lo desea, proporcioné la clasificación de pantalla.
Dhiren Vasoya
¿Qué mensaje viste? ¿El Hello nasty Worldo We can't remove the item!algo más? Proporcione también la captura de pantalla.
Rendy Eko Prastiyo

Respuestas:

11

Busqué algunas cosas más en esto y finalmente encontré mi solución,

Solo necesito cambiar el código de observador de esta manera.

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
fuente
No funciona a mi fin, no sé por qué :)
ENTREGA SINGH
¡¡¡Respuesta perfecta!!! me alegró el día. +1 :)
SagarPPanchal
Mensaje de error no se muestra si la compra está vacía ..
Jafar Pinjar
@jafarpinjar, ¿qué intentas hacer?
Dhiren Vasoya
@ DhirenVasoya, lo siento, me está funcionando
jafar pinjar
4

Actualiza tu clase para que sea así:

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
fuente
Muestra el mensaje en la pantalla, pero aún así elimina el artículo del carrito. El objetivo es que si el observador genera el error, no elimina el artículo del carrito y muestra nuestro mensaje personalizado en la pantalla.
Dhiren Vasoya
sales_quote_remove_itemse dispara después de eliminar un elemento. Si desea hacer una verificación justo antes de eliminar un elemento, debe observar que sales_quote_item_delete_beforeno sales_quote_remove_item. Actualización <event name="sales_quote_remove_item">de su xml a<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo
sigue siendo la misma salida. Muestra el mensaje, pero elimina el artículo del carrito.
Dhiren Vasoya
¿Ha limpiado y vaciado el caché bin/magento cache:clean && bin/magento cache:flushdespués de actualizar su xml?
Rendy Eko Prastiyo
sí, ejecuto el comando
Dhiren Vasoya