Laravel路由参数冲突:/post/new被识别为{id}触发index方法
解决Laravel路由匹配优先级问题
你遇到的问题其实是Laravel路由的匹配顺序导致的——Laravel会按照你定义路由的先后顺序去匹配请求,当你先定义Route::get('/post/{id}', ...)时,它会把new当成{id}参数的值,自然就走到了index方法。
完全不用修改路径,只需要调整一下路由的定义顺序,把/post/new的路由放在/post/{id}前面就行:
// 先定义固定路径的路由 Route::get('/post/new', 'PostController@create'); // 再定义带参数的路由 Route::get('/post/{id}', 'PostController@index');
这样当请求mysite.com/post/new时,Laravel会先匹配到前面的固定路由,直接导向create方法;而其他类似/post/1、/post/abc的请求才会匹配到带{id}参数的路由,走index方法。
另外,如果你想更严谨一点,还可以给{id}参数添加路由约束,比如限制它只能是数字,这样即使顺序没调整,new(字符串)也不会被匹配成id参数,示例代码如下:
Route::get('/post/{id}', 'PostController@index')->where('id', '[0-9]+'); Route::get('/post/new', 'PostController@create');
不过更推荐第一种调整顺序的方式,因为更直观,也能覆盖更多场景(比如你的id可能允许字符串的情况)。
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

