Symfony中无法将locale传入邮件模板的问题求助
解决方案
核心问题原因
异步处理邮件时,app.request 不存在请求上下文,依赖 app.request.locale 获取语言参数会失效;同时生成 app_reset_password 路由时必须显式传入 _locale 参数。
具体解决步骤
1. 在重置请求控制器中传递Locale到邮件上下文
找到处理密码重置请求的控制器方法(通常是 ResetPasswordController::requestResetPasswordAction),在构建邮件时将当前请求的Locale传入context:
// src/Controller/ResetPasswordController.php public function requestResetPasswordAction(Request $request, ResetPasswordHelperInterface $resetPasswordHelper, MessengerInterface $messenger): Response { // 原有逻辑... $resetToken = $resetPasswordHelper->generateResetToken($user); $email = (new TemplatedEmail()) ->from(new Address('your-app@example.com', 'Your App')) ->to($user->getEmail()) ->subject('Reset Your Password') ->htmlTemplate('reset_password/email.html.twig') ->context([ 'resetToken' => $resetToken, 'locale' => $request->getLocale(), // 关键:传递当前请求的Locale ]); $messenger->dispatch(new SendEmailMessage($email)); // 原有逻辑... }
2. 修改邮件模板,显式传入_locale参数
更新邮件模板中的路由生成代码,使用context中传递的locale参数:
{# templates/reset_password/email.html.twig #} <a href="{{ url('app_reset_password', {token: resetToken.token, _locale: locale}) }}"> {{ url('app_reset_password', {token: resetToken.token, _locale: locale}) }} </a>
3. 验证路由配置正确性
确认app_reset_password路由已正确包含{_locale}参数:
# config/routes.yaml app_reset_password: path: /{_locale}/reset-password/{token} controller: App\Controller\ResetPasswordController::resetPassword requirements: _locale: en|zh-CN|fr # 替换为你的项目支持的语言
额外注意事项
- 如果使用SymfonyCastsResetPasswordBundle自带的控制器,需要创建自定义邮件处理器或通过
ResetPasswordRequestEvent事件监听来注入Locale参数到邮件上下文 - 绝对不能依赖
app.request获取Locale:异步任务脱离请求上下文,该变量无法访问
内容的提问来源于stack exchange,提问作者titouille
相关产品推荐
相关产品推荐

