首页 > 解决方案 > 如何在 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 浏览器创建新帐户,则电子邮件确认链接将创建当前区域设置,例如https://example.com/XX/user/register/confirm/TOKEN

现在我添加了一个REST API允许从移动应用程序(iOS 和 Android)中创建新用户。这是通过将必要的数据(用户名、密码等)简单地发布到控制器来完成的,其中包括处理用户创建的控制器。

问题: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);

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

标签: symfonylocalefosuserbundlesymfony-routing

解决方案


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

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

推荐阅读