如何在 Symfony 2.8 中手动设置路由器语言环境

How to manually set router locale in Symfony 2.8

我是 运行 一个基于 Symfony 2.8 的网络应用程序,它使用 FOSUserBundle 来处理用户。

FOSUserBundle 路由使用当前语言环境作为前缀导入:

// app/config/routing.yml
...
# fos_userbundle
user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"
    prefix: "/{_locale}/user"

这很好用。如果用户使用 Web 浏览器创建新帐户,则电子邮件确认 link 会根据当前语言环境创建,例如https://example.com/XX/user/register/confirm/TOKEN

现在我添加了一个 REST API,它允许从移动应用程序(iOS 和 Android)中创建新用户。这是通过简单地发布必要的数据(用户名、密码等)来完成的,包括将区域设置发送到控制器,然后处理用户创建。

问题:使用 REST API 创建的用户总是收到使用默认区域设置 en 的确认 link。

虽然手动设置语言环境可以很好地生成正确语言的确认邮件,但它对确认没有影响link:

public function registerAction(Request $request) { 
    $username = getDataFromRequest(...);
    $userLocale = getDateFromRequest(...);
    ...

    // Set locale manually
    $translator->setLocale(userLocale);
    $sessionLocale = $request->getSession()->set('_locale', userLocale);
    $request->setLocale(userLocale);
    ...

    $mailer = $this->get('fos_user.mailer');
    $tokenGenerator = $this->get('fos_user.util.token_generator');

    if (null === $user->getConfirmationToken()) 
        $user->setConfirmationToken($tokenGenerator->generateToken());

    $mailer->sendConfirmationEmailMessage($user);

    ...
}

我检查了 sendConfirmationEmailMessage(...) 的代码,它使用默认路由器生成确认 link:

$url = $this->router->generate('fos_user_registration_confirm', array('token' => $user->getConfirmationToken()), UrlGeneratorInterface::ABSOLUTE_URL);

问题:如何告诉路由器使用正确的语言环境?

将语言环境定义为路由生成器的参数:

$url = $this->router->generate(
    'fos_user_registration_confirm', 
    array(
        'token' => $user->getConfirmationToken(),
        '_locale' => $userLocale,
    ),
    UrlGeneratorInterface::ABSOLUTE_URL
);

在研究了一半的 Symfony 代码后,我发现了路由器从哪里获取语言环境,并找到了适合我的解决方案。也许它对其他人也有用。

只需使用以下代码更新路由器语言环境:

$router->getContext()->setParameter('_locale', $locale);