如何在Symfony 2.8中手动设置路由器区域设置
我正在运行一个基于如何在Symfony 2.8中手动设置路由器区域设置,symfony,locale,fosuserbundle,symfony-routing,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" 这个很好用。如果用户使用web浏览器创建
Symfony 2.8
的web应用程序,它使用FOSUserBundle
来处理用户
FOSUserBundle
路由使用当前区域设置作为前缀导入:
// app/config/routing.yml
...
# fos_userbundle
user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
prefix: "/{_locale}/user"
这个很好用。如果用户使用web浏览器创建新帐户,则会根据当前区域设置创建电子邮件确认链接,例如https://example.com/XX/user/register/confirm/TOKEN
现在我添加了一个restapi
,允许在移动应用程序(iOS和Android)中创建新用户。这是通过简单地将必要的数据(用户名、密码等)包括区域设置发布到控制器来完成的,而不是处理用户创建
问题是:使用restapi
创建的用户总是使用默认区域设置(即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);
...
}
$url = $this->router->generate('fos_user_registration_confirm', array('token' => $user->getConfirmationToken()), UrlGeneratorInterface::ABSOLUTE_URL);
我已经检查了发送确认邮件(…)
的代码,它使用默认路由器生成确认链接:
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);
...
}
$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);
这是可能的,但我必须重写/重新实现
FOSUserBundle
方法sendconfirmationmailmessage(…)
,才能实现这一点。可能,但相当复杂。我更喜欢在我自己的代码内的解决方案,而不需要接触任何第三方代码。我不明白路由器一开始是从哪里得到错误的区域设置的。