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

时间:2018-11-14 15:44:04

标签: symfony locale fosuserbundle symfony-routing

我正在运行一个基于Symfony 2.8的Web应用程序,该应用程序使用FOSUserBundle处理用户。

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

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

这很好。如果用户使用网络浏览器创建了一个新帐户,则会在当前语言环境(例如)中创建电子邮件确认链接。 https://example.com/XX/user/register/confirm/TOKEN

现在,我添加了一个REST API,可以在移动应用程序(iOS和Android)中创建新用户。这可以通过简单地POST必要数据(用户名,密码等)来完成,这些数据包括控制器的语言环境,而不是处理用户的创建。

问题:使用REST API创建的用户始终会使用默认语言环境en接收确认链接。

虽然手动设置区域设置可以正确生成语言正确的确认邮件,但对确认链接无效:

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(...)的代码,它使用默认路由器来生成确认链接:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

使用以下代码简单地更新路由器区域设置:

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