laravel - Laravel 中的断路取决于文件中定义的位置
问题描述
我在我的中定义了这些路线routes/web.php
:
Route::get('references/', 'referenceController@index')
Route::get('references/{reference}', 'referenceController@show')
Route::get('references/create', 'referenceController@create')
像这样,references/create
路由转到 404 页面。
如果我把这条路线放在一行之前,一切正常:
Route::get('references/', 'referenceController@index')
Route::get('references/create', 'referenceController@create')
Route::get('references/{reference}', 'referenceController@show')
那么显然是因为{reference}
我的路线中的一部分,对吧?但是因为我想完美地过滤引用,所以我在RouteServiceProvider.php
. 此模式应检查我的引用是否是格式正确的 UUID :
Route::pattern('reference', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{10}');
远离与模式不匹配的“创建”一词。
你知道为什么我的路由会根据它在文件中的位置进入 404 页面吗?
解决方案
这就是 Laravel 的工作方式。尽管我承认,但在文档中并不是很清楚。
补充资源控制器
如果您需要向资源控制器添加超出默认资源路由集的其他路由,则应在调用 Route::resource 之前定义这些路由;否则,资源方法定义的路由可能会无意中优先于您的补充路由:
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
如果您按照示例中的说明定义非资源路由,这也是正确的。这是因为它会尝试"create"
作为路由中参数的 id传递,reference
这当然是无效的。
经验法则
在定义具有相同 url 段数的路由时,始终首先定义没有参数变量的路由。路由文件将自上而下查找与当前请求匹配的第一条路由。
推荐阅读
- databricks - 我可以在 databricks-connect 中有多个连接吗?
- oracle - 插入带有空白值的语句而不定义所有列
- apache-spark - 为我的数据框创建一个将另一列中的值相乘的新列时,如何避免此 TypeError
- charts - Pine Script:如何在图表上手动绘制所有线条
- reactjs - 为什么 react 会以这种方式更新状态
- github - 如何从我的 jekyll github 页面链接中删除这个 %20?
- sql - 群组分析访问跟踪器导致 BigQuery 中出现无法识别的名称错误
- c# - 如何在 Unity 的物理设置中展开层碰撞矩阵?
- excel - 使用 countifs 公式的 Excel 公式结果返回错误值
- reactjs - 为什么 typescript-eslint 会在具有显式命名参数的函数成员中检测到问题?