带有多个可选参数的网址

时间:2018-10-06 12:24:20

标签: php laravel laravel-5.4

假设我有一个用于搜索汽车的页面,该页面包含3个可选参数,brandyearcolor

简化的路线示例:

Route::get('/cars/{brand?}/{year?}/{color?}', function ($brand = NULL, $year = NULL, $color = NULL) {

    echo "brand is:".$brand."<br>";
    echo "year is:".$year."<br>";
    echo "color is:".$color."<br>";

});

我不知道如何仅传递year参数?

如果传递了所有3个参数(例如:/cars/_/2010/_),则可以使用,但这是非常微不足道的解决方案。

什么是正确的方法?

2 个答案:

答案 0 :(得分:0)

我不知道这是否可行,因为您可能最终仅传递了两个参数,而Laravel无法理解这是brandcolor还是year

关于使用的URL参数的方法,我将花费两分钱:

public function getCars(Request $request){
        Validator::validate($request->all(), [
            'brand' => 'nullable|string',
            'year' => 'nullable|integer',
            'color' => 'nullable|string'
        ]);

        $cars = Car::select('id', '...');

        if($request->has('brand')){
            // get cars with that brand
            $cars->where('brand', $request->brand);
        }

        // ... and so on with the other parameters

        $cars = $cars->paginate(10); // or $cars->get()

    }

这是一个非常简单的示例,因此您必须根据需要进行自定义。希望有帮助。

答案 1 :(得分:0)

如官方文档所述,路由参数根据它们的顺序注入到路由回调/控制器中。在这种特定情况下,Laravel必须知道每个参数的唯一方法就像您建议的那样(请参见https://laravel.com/docs/5.6/routing#route-parameters)。

无论如何,如果执行搜索需要3个参数,则您可能会考虑将请求谓词从 GET 更改为 POST ,并将所有参数作为POST传递请求数据,而不是查询字符串本身。