Laravel 9如何重写route()函数以支持多语言路由参数传递?
Laravel 9 自定义路由生成函数支持 Locale 参数
实现步骤
1. 创建自定义 UrlGenerator 类
在项目的app/Routing目录下新建UrlGenerator.php(目录不存在则手动创建),继承框架原生的UrlGenerator并重写route方法:
<?php namespace App\Routing; use Illuminate\Routing\UrlGenerator as BaseUrlGenerator; class UrlGenerator extends BaseUrlGenerator { public function route($name, $parameters = [], $absolute = true, $locale = null) { // 未指定locale时,使用当前应用的本地化语言 $locale = $locale ?? app()->getLocale(); // 拼接带locale前缀的路由名称 $localizedRouteName = "{$locale}.{$name}"; // 调用父类方法生成最终URL return parent::route($localizedRouteName, $parameters, $absolute); } }
2. 替换框架默认的 UrlGenerator 服务
打开app/Providers/AppServiceProvider.php,在register方法中绑定自定义类,替换原生实现:
public function register() { $this->app->bind(\Illuminate\Routing\UrlGenerator::class, \App\Routing\UrlGenerator::class); }
3. 使用方式
现在可以按需求灵活调用route函数:
- 自动使用当前locale:
route('home') - 指定特定locale生成链接:
route('home', [], true, 'uk') - 携带路由参数的调用:
route('user.detail', ['id' => 123], true, 'en')
注意事项
- 确保所有路由名称严格遵循
{locale}.{name}的命名规则(如ru.home、uk.product),否则会触发路由不存在的异常。 - 如果需要兼容不带locale前缀的特殊路由,可以在重写的
route方法中添加判断逻辑,比如检测路由名称是否已包含.前缀,再决定是否拼接locale。
内容的提问来源于stack exchange,提问作者Денис Линник
相关产品推荐
相关产品推荐

