假如路由文件配置了如下路由
Route::get('/{locale}/photos', [\App\Http\Controllers\IndexController::class, 'test'])->name('post.index');
我们可以通过下面的方式生成该路由
public function locale(Request $request) { return route('post.index', ['locale'=>100]); // 这里写死为2,实际应用可以结合$request动态读取 }
有没有一种方式就写成 route('post.index'])即可,参数通过某种方式默认加上。答案是有的。如何实现?
1.创建中间件,比如我这里创建了一个叫做SetDefaultLocaleForUrls的中间件,包含代码如下:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\URL; class SetDefaultLocaleForUrls { public function handle(Request $request, Closure $next) { URL::defaults(['locale' => 100]); // 这里写死为100,实际应用可以通过$request动态读取 return $next($request); } }
说明:1.记得将中间件写入Kernel类。2.URL默认值和中间件优先级问题:
设置URL默认值可能会干扰Laravel对隐式模型绑定的处理。因此,您应该优先考虑将URL默认值设置为在Laravel自己的SubstituteBindings中间件之前执行的中间件。您可以通过确保中间件SubstituteBindings优先于$middlewarePriority应用程序HTTP内核属性中的中间件来完成此操作。该$middlewarePriority属性在基Illuminate\Foundation\Http\Kernel类中定义。您可以从该类复制其定义,并在应用程序的HTTP内核中覆盖它,以便对其进行修改:
protected $middlewarePriority = [ // ... \App\Http\Middleware\SetDefaultLocaleForUrls::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, // ... ];
2.当路由添加上面的中间件后使用辅助函数route生成的路由就不必手动添加locale参数了。如果手动添加,将覆盖中间件的设置。