如何在Laravel中重写route辅助方法并为指定参数添加默认值?
问题解决方法
你之前的代码不生效主要有两个核心错误:
- extend方法的闭包参数结构错误,Laravel容器的extend方法接收的闭包第一个参数为原绑定实例,第二个为容器实例,你传入的
$name/$parameters等参数位置完全错位,无法正确拿到路由生成的参数 - 扩展逻辑放在
register方法中执行时机错误,该阶段Laravel核心路由服务尚未完成初始化,扩展不会被正确加载
最优解法:使用Laravel内置路由默认参数功能
Laravel本身提供了路由参数默认值配置功能,无需自行重写route方法,直接在AppServiceProvider的boot方法中添加以下代码即可:
use Illuminate\Support\Facades\URL; public function boot() { URL::defaults([ 'locale' => app()->getLocale() ]); }
所有调用route()方法生成链接时,如果没有手动传入locale参数,会自动使用上面配置的默认值。
如果你确实需要自定义扩展route方法的逻辑
如果有更复杂的参数处理逻辑,可以按以下方式修改你的代码:
public function boot() { $this->app->extend('url', function ($urlGenerator, $app) { return new class($urlGenerator) extends \Illuminate\Routing\UrlGenerator { protected $originalGenerator; public function __construct($originalGenerator) { $this->originalGenerator = $originalGenerator; parent::__construct($app['router']->getRoutes(), $app['request']); } public function route($name, $parameters = [], $absolute = true) { if (!isset($parameters['locale'])) { $parameters['locale'] = $this->originalGenerator->getRequest()->getLocale(); } return parent::route($name, $parameters, $absolute); } }; }); }
内容的提问来源于stack exchange,提问作者Farzin
相关产品推荐
相关产品推荐

