Silex 重定向更改语言环境
Silex redirect changing the locale
我正在使用 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。
谢谢。
我找到了这个解决方案:
$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);
}
但我想更优雅地实现其他解决方案。
大家怎么看?
您也可以这样做,但很容易,因为您可以将 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
);
}
我正在使用 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。
谢谢。
我找到了这个解决方案:
$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);
}
但我想更优雅地实现其他解决方案。
大家怎么看?
您也可以这样做,但很容易,因为您可以将 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
);
}