求助:Shopware/Symfony中301/302重定向时触发提示框实现方案
Shopware/Symfony插件实现重定向时显示消息框的方法
1. 拦截重定向并把消息存进会话
Shopware基于Symfony,咱们可以做个事件订阅器,监听内核的响应事件,一旦检测到301/302重定向,就把消息存到Session里,这样跳转后的页面能读到这个消息。
具体操作:
- 在插件里新建一个订阅器类,比如
src/Subscriber/RedirectMessageSubscriber.php:
<?php namespace YourPluginName\Subscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpFoundation\Session\SessionInterface; class RedirectMessageSubscriber implements EventSubscriberInterface { private $session; public function __construct(SessionInterface $session) { $this->session = $session; } public static function getSubscribedEvents(): array { return [ ResponseEvent::class => 'onKernelResponse', ]; } public function onKernelResponse(ResponseEvent $event): void { $response = $event->getResponse(); // 判断是不是301或302重定向 if ($response->isRedirection() && in_array($response->getStatusCode(), [301, 302])) { // 把自定义消息存到FlashBag里,类型选notice,也可以换成success/error $this->session->getFlashBag()->add('notice', '页面已跳转,您访问的内容已迁移到新地址'); } } }
- 接着在插件的
src/Resources/config/services.xml里注册这个订阅器,让Shopware能识别它:
<service id="YourPluginName\Subscriber\RedirectMessageSubscriber"> <argument type="service" id="session"/> <tag name="kernel.event_subscriber"/> </service>
2. 在Twig模板里渲染消息框
接下来要让消息显示在页面上,咱们可以通过模板扩展来加这段逻辑,不用改Shopware核心文件:
在src/Resources/views/storefront/layout/base.html.twig里写:
{% sw_extends '@Storefront/storefront/layout/base.html.twig' %} {% block base_body_inner %} {# 先遍历FlashBag里的消息,渲染成弹窗 #} {% for message in app.flashes('notice') %} <div class="alert alert-warning alert-dismissible fade show mb-3" role="alert"> {{ message }} <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> {% endfor %} {# 保留原来的页面内容 #} {{ parent() }} {% endblock %}
这样所有页面都会在顶部显示这个重定向提示,用的是Shopware自带的alert样式,也可以自己改CSS。
3. 要注意的点
- 确保Session正常工作:Shopware前台默认开启Session,同域重定向的话消息肯定能读到;如果是跨域跳转,这个方法就不行了,不过301/302一般都是同域内的。
- 消息类型可以换:比如用
success对应绿色提示,error对应红色,只要在FlashBag和Twig里对应上就行。 - 自定义消息内容:你可以根据重定向的目标地址或者场景,动态生成不同的消息,比如从响应头里拿Location字段,拼到消息里。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

