我正在运行一个基于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);
问题:如何告诉路由器使用正确的语言环境?
答案 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);