将心比心,方得人心~

laravel 通过辅助函数route生成url是如何为参数添加默认值

周洲 2021-05-17 15:12:43

假如路由文件配置了如下路由

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参数了。如果手动添加,将覆盖中间件的设置。












打赏

『微信打赏』

Tag标签中间件  默认值 

我是有底线的