来自观察者的 Magento 重定向始终有效

Posted

技术标签:

【中文标题】来自观察者的 Magento 重定向始终有效【英文标题】:Magento Redirect from Observer that always works 【发布时间】:2012-10-25 13:44:19 【问题描述】:

我在 Magento 中从观察者创建工作重定向时遇到问题。

据我所知,有很多事件都带有响应对象(在$observer 对象中)。 另一种方法是使用类似的东西

Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));

正如伟大的 Alan Storm 在这里提到的 https://***.com/a/4730200/1700048。

不幸的是,这对我不起作用,即使我像这样添加sendResponse()

Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse();

例如:

我想阻止某些电子邮件地址订阅时事通讯。 因此我为newsletter_subscriber_save_before 事件创建了一个观察者。

在我的观察者方法中,我检查了一些情况,如果它们触发,我想阻止保存时事通讯订阅。 我的计划是添加这样的错误:

Mage::getSingleton('checkout/session')->addError('Email is spam!');

然后让当前页面重新加载(显示错误消息)并使用如上所示的重定向(示例中的checkout/cart 只是为了看到它确实有效)。

很遗憾,重定向不起作用。 为什么sendResponse 在这种情况下不发送响应?

感谢您的帮助:)

【问题讨论】:

最接近解决方案的方法似乎在这里讨论:magentocommerce.com/boards/viewthread/15792/#t325035 Mage::app()->getResponse()->setRedirect($url);法师::app()->getResponse()->sendResponse();出口; exit() 对于此工作至关重要。不幸的是,在某些情况下,这会导致一些错误,包括回滚错误。我不确定它是否足够干净,可以作为通用解决方案的基础。 对于 Magento 2 我们能做什么? 【参考方案1】:

我将缩短并更正Silas Palmer 的代码。

Mage::getSingleton('checkout/session')->addError('Email is spam!');
Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse();
exit;

希望这对某人有所帮助!

【讨论】:

【参考方案2】:

这可行,但不是很优雅:

Mage::getSingleton('core/session')->addError('Email is spam!');
Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
Mage::app()->getResponse()->sendResponse();
exit;

【讨论】:

【参考方案3】:

这应该可以正常工作:s

您是否尝试在setRedirect() 调用后立即退出脚本以查看它是否确实到达那里?

【讨论】:

是的。我肯定在那里。当我使用 Mage::log() 记录响应对象时,我可以看到重定向信息在那里。问题是 sendResponse 方法似乎什么都不做,所以时事通讯 SubscriberController (newAction) 在最后重置它并执行 $this->_redirectReferer() 嗯,那么您是否可以抛出异常而不是添加错误消息?此处建议:***.com/questions/5425416/… 是的。应该是一个聪明的方法。我已经试过了。这里的问题是 app\code\core\Mage\Newsletter\controllers\SubscriberController.php 捕获所有异常。所以很遗憾,我不能用 prepareForward 抛出我自己准备好的异常。如果没有时事通讯控制器的异常捕获,这将是一个好方法。我希望有一个始终有效的解决方案。不管我是什么观察者。我希望 Mage::app:getResponse 方式是这样的 哦,快点:(我没有想法,我很害怕!如果不自己挖掘它,我什么都没有:(【参考方案4】:

您是否考虑过使用您自己的自定义模块覆盖保存新闻信函控制器,而不是创建一个观察者,并在那里发送垃圾邮件逻辑,然后在您的逻辑下方添加新闻信函代码。

您还可以将保存新闻信函的 url 更改为新的自定义模块 url,然后执行垃圾邮件过滤器,如果您认为这是一封有效的电子邮件,那么您可以内部转发到常规保存新闻信函(参见 how to call one action from another in magento? )

因此,从控制器重定向不会有任何问题

【讨论】:

感谢您的建议。它会按照你建议的方式工作,但我希望我可以绕过用观察者覆盖的需要。这不是我第一次需要从观察者内部停止正常工作流程并进行自定义重定向。我的希望是获得一个适用于每个观察者的通用解决方案,而不仅仅是明确获得响应对象的观察者。而且我仍然不明白为什么像 Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse(); 这样的代码在观察者内部不起作用。

以上是关于来自观察者的 Magento 重定向始终有效的主要内容,如果未能解决你的问题,请参考以下文章

Magento 重定向问题

magento:某些 htaccess 重定向不起作用

Spring Security OAuth2 始终重定向到具有有效 Bearer 标头的 /login 页面

Magento:如何删除所有永久重定向

magento 将结帐付款重定向到第三方网关

Magento - PayPal 未重定向到移动网站