如何在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(…)
,才能实现这一点。可能,但相当复杂。我更喜欢在我自己的代码内的解决方案,而不需要接触任何第三方代码。我不明白路由器一开始是从哪里得到错误的区域设置的。