Silex перенаправляет изменение языка

Я использую Silex 2, и я хотел бы перенаправить на домашнюю страницу с локалью по умолчанию, если какой-либо url загружен с использованием недействительной локали.

// homepage / root
 $this->get('{_locale}/', function (Request $request) use ($app) {
 return $app['twig']->render('index/index.html.twig', array());
 })->bind('homepage');

Перед промежуточным программным обеспечением:

// i18n Control
 $locale = $request->getLocale();
 $allowLocale = ['en','es','de'];
 if (!in_array($locale, $allowLocale)) {
 $request->setLocale('en');
 $response = new \Symfony\Component\HttpFoundation\RedirectResponse($app['url_generator']->generate('homepage'), 301);
 $response->prepare($request);
 return $response->send();
 }

Но этот код создает бесконечный цикл.

Я хочу:

Если пользователь вставляет этот URL-адрес:/es/foo, все в порядке.

Если пользователь вставляет этот URL:/fr/foo, то он должен быть перенаправлен на /en.

Спасибо.

2 ответа

Вы можете сделать то же самое, но легко, поскольку вы можете передать параметр URL-адреса службе url_generator. Кроме того, чтобы сделать ваше приложение более гибким и менее подверженным ошибкам, вы должны скрыть контейнер для глобальных конфигураций (для allowedLocales и defaultLanguage):

// somewhere in your configuration
$app['defaultLanguage'] = 'en';
$app['allowedLocales'] = ['en','es','de']
// Then in your controller
$locale = $request->getLocale();
if (!in_array($locale, $app['allowLocales'])) {
 $request->setLocale($app['defaultLanguage']);
 $app['translator']->setLocale($app['defaultLanguage']);
 return $app->redirect(
 $app['url_generator']->generate('homepage', ["locale" => $app['defaultLanguage']]), 
 301
 );
}


Я нашел это решение:

$locale = $request->getLocale();
 $allowLocale = ['en','es','de'];
 if (!in_array($locale, $allowLocale)) {
 $defaultLanguage = 'en';
 $targetUrl = $app['url_generator']->generate('homepage');
 $request->setLocale($defaultLanguage);
 $app['translator']->setLocale($defaultLanguage);
 $targetUrl = str_replace("/$locale/", "/$defaultLanguage/", $targetUrl);
 return $app->redirect($targetUrl, 301);
 }

Но я хотел бы реализовать другое решение более элегантно.

Как вы думаете, ребята?

licensed under cc by-sa 3.0 with attribution.