Symfony Localization:Redirect / xyz to / en / xyz

时间:2016-03-15 12:30:58

标签: php symfony redirect

我正在使用Symfony 2处理Web应用程序项目。该页面将以三种不同的语言提供。稍后将添加更多语言。

因此somepage/en/somepage下可以使用/fr/somepage,依此类推。

我分两步解决了这个问题:

  1. 主页/的访问者会根据HTTP语言标题自动重定向到本地化主页/en/fr
  2. 使用prefix="/{_locale}"
  3. 导入所有路线

    这是我使用的代码:

    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添加到所有公共路由的主路由文件中(就像我为主页所做的那样)。这是可能的,但非常麻烦。我在这里寻找自动化解决方案。

    知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

这里有几个选项:

  • 创建一个操作来处​​理重定向并为其创建catch-all路由并将其作为最后一条路由放入app/config/routing.yml。您可以使用router:debug(或debug:router)命令检查订单。如果没有其他路线匹配,将执行该操作。

  • 您可以为kernel.exception事件创建事件监听器,并在那里设置重定向响应

  • 使用现有的捆绑JMSI18nRoutingBundleBeSimpleI18nRoutingBundle

我会去捆绑。