使用可选参数了解Laravel路线

时间:2017-04-27 19:45:50

标签: php laravel laravel-5 routes

我正在尝试使用Laravel 5.4创建一个带有一个可选参数的路径。

路线:

Route::get('/run/{zone?}/id/{id}', 'RunController@show');

控制器:

class RunController extends Controller
{
    public function show()
    {
        $route = \Route::current();
        $zone = $route->parameter('zone') ?: 'default';
        $id = $route->parameter('id');

        Run::setZone($zone);
        $run = Run::findOrFail($id);
        return view('run.show')->with(['run' => $run]);
    }
}

网址run/test/id/42的效果与预期相同。

但是run/id/42我得到了一个很好的NotFoundHttpException in RouteCollection.php,当我期望与run/default/id/42

相同的结果时

我错过了什么?

2 个答案:

答案 0 :(得分:1)

可选参数在最后一个URL元素时起作用,因此在您的情况下它不会起作用。

答案 1 :(得分:1)

第一个可选参数后的所有内容都必须是可选的。如果需要在可选参数之后的路径的一部分,则该参数变为必需。

在您的情况下,路由的id/{id}部分是非可选的,因此"可选"在该路段的部分变为必需之前的参数。

Laravel的路由实际上建立在Symfony的路由之上,这是Symfony的限制。根据{{​​3}}(强调我的):

  

当然,您可以拥有多个可选占位符(例如/blog/{slug}/{page}),,但可选占位符后的所有内容都必须是可选的。例如,/{page}/blog是有效路径,但始终需要页面(即,/blog只与此路线不匹配。)

此外,还需要注意另一件事:

  

末尾带有可选参数的路由与带有斜杠的请求不匹配(即/blog/将不匹配,/blog将匹配)。