Magento 2:事件观察者异常不在屏幕上显示


8

在自定义扩展中,我这样创建观察者。

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>

和我的观察者:

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

调用了我的Observer函数,但是它没有在页面上显示自定义错误。对此,它会在exception.log文件中显示我的消息。

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 

查看它如何显示默认消息。 在此处输入图片说明


执行观察者时,页面的外观如何?
Rendy Eko Prastiyo

它显示默认消息“我们无法删除该项目。” 安装自定义消息。我现在更新问题检查。
Dhiren Vasoya '17

您确定要执行的想法已执行吗?如何调试:尝试将输出发送到浏览器,Hello Nasty World!然后添加exit以退出该$message = 'blablabla'行上方的代码执行。如果看到该消息,则可以转到下一步。尝试一下,如果现在将Hello Nasty World!其发送到浏览器,请允许我。
Rendy Eko Prastiyo,

是的,如果我在其旁边放置出口,它将在屏幕上显示消息。如果您愿意,那么我提供了屏幕排序。
Dhiren Vasoya '17

您看到了什么讯息?该Hello nasty WorldWe can't remove the item!或其他什么东西?请同时提供屏幕截图。
伦迪·埃科·普拉斯蒂约

Answers:


11

我在此搜索更多内容,最终找到了解决方案,

我需要像这样更改观察者代码。

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

不工作在我的尽头不知道为什么:)
SURENDER SINGH

完美的答案!!!让我开心。+1 :)
SagarPPanchal

未示出,如果车是空的错误消息..
贾法尔pinjar

@jafarpinjar您正在尝试做什么?
Dhiren Vasoya

@DhirenVasoya,很抱歉它为我工作
jafar pinjar

4

更新您的班级,使其像这样:

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

它在屏幕上显示消息,但仍从购物车中删除物品。目标是如果观察者产生错误,则它不会从购物车中移除物品并在屏幕上显示我们的自定义消息。
Dhiren Vasoya '17

sales_quote_remove_item删除项目后被解雇。如果要在删除项目之前进行检查,则必须注意sales_quote_item_delete_before,而不要注意sales_quote_remove_item<event name="sales_quote_remove_item">您的xml 更新至<event name="sales_quote_item_delete_before">
Rendy Eko Prastiyo,2017年

仍然相同的输出。它显示消息,但从购物车中删除项目。
Dhiren Vasoya '17

bin/magento cache:clean && bin/magento cache:flush更新xml后,您是否清理并刷新了缓存?
Rendy Eko Prastiyo

是的,我运行命令
Dhiren Vasoya '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.