Как вручную установить локаль маршрутизатора в Symfony 2.8 - PullRequest
0 голосов
/ 14 ноября 2018

Я запускаю веб-приложение на основе Symfony 2.8, которое использует FOSUserBundle для обработки пользователей.

Маршруты FOSUserBundle импортируются с использованием текущей локали в качестве префикса:

// app/config/routing.yml
...
# fos_userbundle
user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"
    prefix: "/{_locale}/user"

Это отлично работает.Если пользователи создают новую учетную запись с помощью веб-браузера, ссылка для подтверждения электронной почты создает текущую локаль, например, 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);

Вопрос: Как указать маршрутизатору использовать правильную локаль?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Пролистав половину кода Symfony, я узнал, откуда маршрутизатор получает локаль, и нашел решение, которое работает для меня. Может быть, это полезно и для других.

Просто обновите локаль маршрутизатора, используя следующий код:

$router->getContext()->setParameter('_locale', $locale); 
0 голосов
/ 14 ноября 2018

Определить локаль в качестве параметра генератора маршрута:

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