You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.5 URL前缀式多语言路由配置问题求助

解决Laravel多语言路由路径不符的问题

看起来你需要调整路由的路径结构,同时确保Locale中间件正确处理默认语言的URL省略逻辑。我来帮你一步步修正:

1. 修正路由定义

你当前的hero.create路由路径是/hero/create,这和你想要的/create/hero顺序相反。直接调整分组内的路由路径即可,同时保持locale前缀的可选性:

// routes/web.php
Route::group([
    'prefix' => '{locale?}',
    'middleware' => \App\Http\Middleware\Locale::class
], function (\Illuminate\Routing\Router $router) {
    // 根路径:/(默认语言)、/fr、/nl
    Route::get('/', 'LandingController@index')->name('home');
    
    // 英雄创建路径:/create/hero(默认)、/fr/create/hero、/nl/create/hero
    Route::get('/create/hero', 'HeroController@create')->name('hero.create');
});

2. 完善Locale中间件逻辑

你的Locale中间件需要处理两个关键逻辑:

  • 当URL中没有locale参数时,自动设置默认语言
  • 当使用默认语言时,生成URL时自动省略locale前缀(可选但推荐,避免重复的URL)

下面是中间件的示例实现:

// app/Http/Middleware/Locale.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class Locale
{
    // 定义支持的语言列表
    protected $supportedLocales = ['en', 'fr', 'nl'];

    public function handle($request, Closure $next)
    {
        // 获取路由中的locale参数
        $locale = $request->route('locale');

        // 如果没有传入locale,使用配置的默认语言
        if (!$locale) {
            $locale = config('app.locale');
        }

        // 验证语言是否支持,不支持则回退到默认语言
        if (!in_array($locale, $this->supportedLocales)) {
            $locale = config('app.fallback_locale');
        }

        // 设置应用语言
        App::setLocale($locale);

        // 可选:如果访问默认语言带locale的URL,重定向到不带locale的版本(比如/en/create/hero → /create/hero)
        if ($locale === config('app.locale') && $request->route('locale')) {
            $routeName = $request->route()->getName();
            $routeParams = $request->route()->parameters();
            unset($routeParams['locale']);
            return redirect()->route($routeName, $routeParams);
        }

        return $next($request);
    }
}

3. 配置默认语言

确保在config/app.php中设置好默认语言和 fallback语言:

// config/app.php
'locale' => 'en', // 默认语言
'fallback_locale' => 'en',

4. 测试路由生成

现在你可以用Laravel的路由生成函数验证效果:

  • 默认语言:route('home') → /;route('hero.create') → /create/hero
  • 法语:route('home', ['locale' => 'fr']) → /fr;route('hero.create', ['locale' => 'fr']) → /fr/create/hero
  • 荷兰语:route('home', ['locale' => 'nl']) → /nl;route('hero.create', ['locale' => 'nl']) → /nl/create/hero

这样就能完全匹配你期望的URL规则了。

内容的提问来源于stack exchange,提问作者user936965

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:09:09