首页 > 解决方案 > 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

解决方案


这就是 Laravel 的工作方式。尽管我承认,但在文档中并不是很清楚。

补充资源控制器

如果您需要向资源控制器添加超出默认资源路由集的其他路由,则应在调用 Route::resource 之前定义这些路由;否则,资源方法定义的路由可能会无意中优先于您的补充路由:

Route::get('photos/popular', 'PhotoController@method');

Route::resource('photos', 'PhotoController');

如果您按照示例中的说明定义非资源路由,这也是正确的。这是因为它会尝试"create"作为路由中参数的 id传递,reference这当然是无效的。


经验法则

在定义具有相同 url 段数的路由时,始终首先定义没有参数变量的路由。路由文件将自上而下查找与当前请求匹配的第一条路由。


推荐阅读