注:以下内容基于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的方式如下:
1route('post.index', app()->getLocale());每次使用route时都需要设置,不管是在控制器还是在视图,搞的感觉就很傻,一直想找省事的地方统一设置,不用每次都去设置,但是一直没找到,想写个中间件来处理,也没搞好。
直到我查资料时翻到了一个文档: https://learnku.com/docs/laravel/5.7/urls/2260#225f3e
1URL::defaults(['locale' => $request->user()->locale]);这样设置中间件就可以了:
1namespace App\Http\Middleware;2
3use Closure;4use Illuminate\Support\Facades\URL;5
6class SetDefaultLocaleForUrls7{8 public function handle($request, Closure $next)9 {10 URL::defaults(['locale' => $request->user()->locale]);11
12 return $next($request);13 }14}设置kernel
1class Kernel extends HttpKernel2{3...4 protected $middlewareAliases = [5 ...6 'setlocale' => \App\Http\Middleware\SetDefaultLocaleForUrls::class,7 ...8 ];9}路由配置文件中使用
1Route::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就不需要再附带语言参数了。