我正在尝试使用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
我错过了什么?
答案 0 :(得分:1)
可选参数在最后一个URL元素时起作用,因此在您的情况下它不会起作用。
答案 1 :(得分:1)
第一个可选参数后的所有内容都必须是可选的。如果需要在可选参数之后的路径的一部分,则该参数变为必需。
在您的情况下,路由的id/{id}
部分是非可选的,因此"可选"在该路段的部分变为必需之前的参数。
Laravel的路由实际上建立在Symfony的路由之上,这是Symfony的限制。根据{{3}}(强调我的):
当然,您可以拥有多个可选占位符(例如
/blog/{slug}/{page}
),,但可选占位符后的所有内容都必须是可选的。例如,/{page}/blog
是有效路径,但始终需要页面(即,/blog
只与此路线不匹配。)
此外,还需要注意另一件事:
末尾带有可选参数的路由与带有斜杠的请求不匹配(即
/blog/
将不匹配,/blog
将匹配)。