如何在Shopware注册邮件的确认URL中添加redirectParameters参数?
问题描述
当客户访问需要登录的URL(例如mydomain.com/myrestrictedpage)时,Shopware会保留该URL,客户登录后会被重定向至目标页面:
- 不含重定向信息的登录URL:
mydomain.com/account/login - 包含重定向信息的登录URL:
mydomain.com/account/login?redirectTo=myrestrictedpage&redirectParameters%3D%7B%22mycustomkey%22%3A%22bad0ef8cf33e4dd79935b63ca6b8afa1%22%7D
但Shopware注册邮件的确认URL仅包含redirectTo参数,缺失redirectParameters参数,导致用户完成注册确认后被重定向到/myrestrictedpage时,因缺少必填参数mycustomkey(值为bad0ef8cf33e4dd79935b63ca6b8afa1)触发500错误。
解决方案(遵循Shopware最佳实践)
无需修改Shopware核心代码,通过事件订阅器即可扩展注册确认链接的生成逻辑:
1. 创建事件订阅器类
在你的插件目录下创建src/Subscriber/RegisterConfirmUrlSubscriber.php,代码如下:
<?php namespace YourPluginNamespace\Subscriber; use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class RegisterConfirmUrlSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ CustomerRegisterEvent::class => 'addRedirectParametersToConfirmUrl', ]; } public function addRedirectParametersToConfirmUrl(CustomerRegisterEvent $event): void { // 仅当请求中存在redirectTo参数时处理 if (!$event->getRequest()->query->has('redirectTo')) { return; } // 获取请求中的redirectParameters参数,默认空对象 $redirectParameters = $event->getRequest()->query->get('redirectParameters', '{}'); // 解析原有确认URL,追加redirectParameters参数 $confirmUrl = $event->getConfirmUrl(); $parsedUrl = parse_url($confirmUrl); parse_str($parsedUrl['query'] ?? '', $queryParams); $queryParams['redirectParameters'] = $redirectParameters; // 重新拼接确认URL $newQuery = http_build_query($queryParams); $newConfirmUrl = sprintf( '%s://%s%s?%s', $parsedUrl['scheme'], $parsedUrl['host'], $parsedUrl['path'], $newQuery ); // 更新事件中的确认URL $event->setConfirmUrl($newConfirmUrl); } }
2. 注册订阅器服务
在插件的src/Resources/config/services.xml中添加服务配置:
<?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="YourPluginNamespace\Subscriber\RegisterConfirmUrlSubscriber"> <tag name="kernel.event_subscriber"/> </service> </services> </container>
逻辑说明
- 订阅
CustomerRegisterEvent事件:该事件触发于用户注册完成、确认邮件发送之前 - 从注册请求中提取
redirectParameters参数(若存在) - 解析原确认URL,将
redirectParameters追加到查询参数中,重新生成完整URL - 更新事件内的确认URL,确保邮件中的链接包含完整重定向参数
用户点击确认链接完成注册验证后,系统会带着完整的redirectTo和redirectParameters参数重定向至目标页面,避免因参数缺失导致的500错误。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

