我正在使用Symfony 2处理Web应用程序项目。该页面将以三种不同的语言提供。稍后将添加更多语言。
因此somepage
,/en/somepage
下可以使用/fr/somepage
,依此类推。
我分两步解决了这个问题:
/
的访问者会根据HTTP语言标题自动重定向到本地化主页/en
,/fr
等prefix="/{_locale}"
这是我使用的代码:
app/config/config.xml
...
parameters:
app.default_locale: en
app.locales: en|fr|es
src/AppBundle/Resources/config/routing.xml
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<!-- Home route to redirect to the right route -->
<route id="home_redirect" path="" methods="GET">
<default key="_controller">AppBundle:Public:home</default>
</route>
<!-- Routes for the localized public pages -->
<import
resource="@AppBundle/Resources/config/public_routes.xml" prefix="/{_locale}" >
<requirement key="_locale">%app.locales%</requirement>
<default key="_locale">%app.default_locale%</default>
</import>
<!-- Routes that should not be extended by any locale -->
<import resource="@AppBundle/Resources/config/unlocalized_routes.xml" />
</routes>
src/AppBundle/Resources/config/public_routes.xml
...
<route id="home" path="" methods="GET">
<default key="_controller">AppBundle:Public:home</default>
</route>
<route id="public_register" path="/somepage" methods="GET">
<default key="_controller">AppBundle:Public:register</default>
</route>
...
src/AppBundle/Controller/PublicController.php
class PublicController extends Controller {
public function homeAction(Request $request) {
// Check if the locale is set in the url
$locale = $request->attributes->get('_locale');
if (!$locale) {
// Try to get the preferred language from the request header
$locale = AppSettings::getLanguage($request);
return $this->redirectToRoute('home', array('_locale' => $locale));
}
elseif (!AppSettings::checkLanguage($locale)) {
// Language in URL is not supported --> Page not found
throw $this->createNotFoundException();
}
return $this->render('AppBundle:Default:homepage.html.twig');
}
}
因此访问example.com
不是问题。这将重定向到example.com/xx
,其中xx
是区域设置。此外,从public_routes.xml
导入的所有路由都自动以区域设置作为前缀。另一方面,从unlocalized_routes.xml
导入的路由仍然可以直接/没有区域设置。
但是无法直接访问example.com/somepage
(在public_routes.xml
中定义)。必须使用支持的语言环境,如example.com/en/somepage
我希望能够直接从public_routes.xml
调用所有路由(没有语言环境),让Symfony处理重定向到本地化页面/路由。就像现在主页/
可能一样。
当然,我可以将someroute_redirect
添加到所有公共路由的主路由文件中(就像我为主页所做的那样)。这是可能的,但非常麻烦。我在这里寻找自动化解决方案。
知道如何解决这个问题吗?
答案 0 :(得分:2)
这里有几个选项:
创建一个操作来处理重定向并为其创建catch-all
路由并将其作为最后一条路由放入app/config/routing.yml
。您可以使用router:debug
(或debug:router
)命令检查订单。如果没有其他路线匹配,将执行该操作。
您可以为kernel.exception
事件创建事件监听器,并在那里设置重定向响应
我会去捆绑。