【问题标题】:How to manually set router locale in Symfony 2.8如何在 Symfony 2.8 中手动设置路由器区域设置
【发布时间】:2018-11-14 15:44:04
【问题描述】:

我正在运行一个基于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)中创建新用户。这是通过简单的 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);

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

【问题讨论】:

    标签: symfony locale fosuserbundle symfony-routing


    【解决方案1】:

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

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

    【讨论】:

    • 这是可能的,但我必须重写/重新实现 FOSUserBundle 方法 sendConfirmationEmailMessage(...) 来实现这一点。可能但相当复杂。我更喜欢我自己的代码中的解决方案,而无需触及任何第三方代码。我不明白路由器首先从哪里得到错误的语言环境。
    【解决方案2】:

    在挖掘了一半 Symfony 代码后,我发现了路由器从哪里获取语言环境,并找到了适合我的解决方案。也许它对其他人也有用。

    只需使用以下代码更新路由器区域设置:

    $router->getContext()->setParameter('_locale', $locale); 
    

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 2017-04-18
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多