当前位置: 首页 > 知识库问答 >
问题:

将所有没有_locale的路由重定向到新路由,包括Symfony 2.8中的_locale

卓学智
2023-03-14

(以防你看过我的上一个问题:不要混淆问题的第一部分/引言是相同的。最后的问题是不同的:)

我正在使用Symfony 2.8开发一个WebApp项目。我想在页面中添加不同的语言。根据用户的区域设置,所有路由/url应从/some/url更改为/locale/some/url,例如/en/some/url`。

添加语言之前,主路由文件如下所示:

<?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">

    <!-- Routes for the public pages -->
    <import
        resource="@AppBundle/Resources/config/routing/public_routes.xml" />

    ...
</routes>

以及公共路线。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">

    <route id="home" path="" methods="GET">
        <default key="_controller">AppBundle:Default:home</default>
    </route>

    <route id="public_price" path="/price" methods="GET">
        <default key="_controller">AppBundle:Default:price</default>
    </route>

    <route id="public_about" path="/about" methods="GET">
        <default key="_controller">AppBundle:Default:about</default>
    </route>

    ...
</routes>

到目前为止,一切都很简单。现在,我在路由中添加了以下内容以添加本地化:

<?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:Default:home</default>
    </route>

    <!-- Routes for the localized public pages -->
    <import
        resource="@AppBundle/Resources/config/routing/public_routes.xml"
        prefix="/{_locale}" >

        <requirement key="_locale">en|fr|es</requirement>
        <default key="_locale">en</default>        
     </import>

    ...
</routes>

因此,公共页面的导入被扩展为前缀=“/{u locale}”,它自动将当前区域设置添加到公共路径的所有路径中。xml

这个很好用。我现在可以导航到/en/en/price/en/about,等等。

为了仍然能够导航到“空”路由(没有任何附加路径的域),我添加了home\u重定向路由及其控制器:

public function homeAction(Request $request) {
    $locale = $request->attributes->get('_locale');
    if (!$locale) {
        // Try to get the preferred language from the request
        $locale = MySettings::getLanguage($request);               
        return $this->redirectToRoute('home', array('_locale' => $locale));
    } elseif (!MySettings::checkLanguage($locale)) {
        // Invalid Locale...
        throw $this->createNotFoundException();
    }

    return $this->render('AppBundle:Default:homepage.html.twig');
}

因此,如果为请求设置了\u locale,则homeAction会检查该语言是否受支持或引发错误。如果未设置\u locale,则homeAction会尝试从请求中获取当前的\u locale(例如,从浏览器接受的语言)。

如果"/"被调用,用户将自动被重定向到/en/fr或任何当前本地。

这对主页来说很好,但我想对所有“旧”路线都实现同样的效果,比如/about/price

当然,我可以添加一个关于重定向路由,就像我添加了一个主页重定向路由一样。但是,对所有的旧路线这样做将是相当麻烦和丑陋的。

有没有更好、更优雅、更自动化的解决方案?

谢谢!


共有1个答案

牧宁
2023-03-14

您可以添加监听器来检查是否设置了区域设置。

$kernel->getContainer()->get('event_dispatcher')->addListener(\Symfony\Component\HttpKernel\KernelEvents::REQUEST, function($event) {
    if ($event->getRequestType() != \Symfony\Component\HttpKernel\HttpKernelInterface::MASTER_REQUEST) return;

    $request = $event->getRequest();
    $locale = $request->attributes->get('_locale');
    if (!$locale) {
        // Try to get the preferred language from the request
        $locale = MySettings::getLanguage($request);
        return new \Symfony\Component\HttpFoundation\RedirectResponse('/' . $locale . '/' . ltrim($request->getRequestUri(), '/'));
    } elseif (!MySettings::checkLanguage($locale)) {
        // Invalid Locale...
        throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
    }
});

....

$response = $kernel->handle($request);
 类似资料:
  • 问题内容: 我正在制作Angular + NestJS应用,我想发送所有路线的文件。 主要 应用控制器 打开时它工作正常,但是如果打开,服务器随即提示。我一直在搜寻为什么我会收到此错误,而所有人都说,但是我不想使用某些引擎,我只想发送由angular构建的纯html,而不会像hack一样。请帮忙 问题答案: 您只能使用并与像车把(HBS)视图引擎; 用于提供静态文件(角度),但是,您只能使用和。

  • 我有一个Quarkus应用程序,它都包了一个角水疗(捆绑在罐子里)。Quarkus提供后端API路由供前端使用。在构建Quarkus应用程序时,将Angular应用程序构建复制到目标中的路径。 我没有使用JAX-RS来注册路由。相反,我直接在Vertx路由器上的方法中以编程方式注册它们。 我希望任何不被识别的路由(无论是作为Vertx注册的路由还是静态资源)被重新定向到,以便我的Angular应用

  • 英文原文:http://emberjs.com/guides/routing/redirection/ 过渡与重定向 在路由中调用transitionTo或者在控制器中调用transitionToRoute,将停止当前正在进行的过渡,并开启一个新的,这也用作重定向。transitionTo具有参数,其行为与link-to助手相同。 如果过渡到一个没有动态段的路由,路由的model钩子始终都会运行。

  • 我正在设置一个使用自定义包和laravel身份验证中间件的laravel 5.3应用程序。当我在laravel/packages/vendor/packageName/src/routes中定义路由时。php与中的情况相同 它重定向到localhost:8000/dashboard定义在ReDirectIf身份验证中间件的url,但当我在资源/路由/web.php中定义路由时,它会根据需要路由和授

  • 问题内容: 我有一些路线的角度应用程序,例如: 使用angular的html5路由模式,当您从应用程序内单击指向链接的链接时,这些链接可以正确解决,但是当您进行硬刷新时,这些链接当然会出现404错误。为了解决这个问题,我尝试实现基本的htaccess重写。 这适用于角度请求,但是当我尝试在我的域内加载脚本或进行ajax调用时,例如: 该脚本不会加载-它的请求被重定向,并且它尝试加载index.ht