夜火笔记

Laravel i18n链接路由前缀locale 如何让route不用每次都设置

2024-06-14
笔记 phplaravel
2分钟
356字

注:以下内容基于php 8.1, laravel 10

最近在使用laravel写一个需要i18n的项目,laravel设置i18n多语言很方便,没什么说的。但是我在使用route生成超链接地址时,每次都需要在route的参数里填写当前语言,才能生成对应的超链接。

超链接类似这样: www.baidu.com/zh_cn/xxx/xxx www.baidu.com/en/xxx/xxx

使用route生成url的方式如下:

1
route('post.index', app()->getLocale());

每次使用route时都需要设置,不管是在控制器还是在视图,搞的感觉就很傻,一直想找省事的地方统一设置,不用每次都去设置,但是一直没找到,想写个中间件来处理,也没搞好。

直到我查资料时翻到了一个文档: https://learnku.com/docs/laravel/5.7/urls/2260#225f3e

1
URL::defaults(['locale' => $request->user()->locale]);

这样设置中间件就可以了:

app/Http/Middleware/SetLocaleMiddleware.php
1
namespace App\Http\Middleware;
2
3
use Closure;
4
use Illuminate\Support\Facades\URL;
5
6
class SetDefaultLocaleForUrls
7
{
8
public function handle($request, Closure $next)
9
{
10
URL::defaults(['locale' => $request->user()->locale]);
11
12
return $next($request);
13
}
14
}

设置kernel

app/Http/Kernel.php
1
class Kernel extends HttpKernel
2
{
3
...
4
    protected $middlewareAliases = [
5
    ...
6
    'setlocale' => \App\Http\Middleware\SetDefaultLocaleForUrls::class,
7
    ...
8
];
9
}

路由配置文件中使用

routes/web.php
1
Route::group([
2
    'middleware' => [
3
        'setlocale'
4
    ],
5
    'prefix' => '{locale}',
6
], function (Router $router) {
7
    $router->get('/', function () {
8
        return view('welcome');
9
    });
10
});

像上面这样,将需要默认语言前缀的路由,写到group的匿名函数中就可以了。

之后,使用route生成url就不需要再附带语言参数了。

本文标题:Laravel i18n链接路由前缀locale 如何让route不用每次都设置
文章作者:夜火/xloong
发布时间:2024-06-14
Copyright 2026
站点地图