如何在 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);
我是 运行 一个基于 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);