You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:15:51