Laravel 8 从下到上的路线顺序
Posted
技术标签:
【中文标题】Laravel 8 从下到上的路线顺序【英文标题】:Laravel 8 route order from bottom to top 【发布时间】:2021-11-30 17:10:35 【问题描述】:我已经安装了 Laravel 8 并且运行良好,然后我尝试学习路由并尝试制作一些这样的路由
Route::view('testing', 'welcome')->name('testingWelcome');
Route::get('testing',[TestingController::class, 'noParameter'])->name('testingNoParam');
Route::view('testing', 'dashboard')->name('testingDashboard');
这里的一些帖子说 web.php 中的路由从上到下工作。但是,这不是我在 url http://localhost/laraps/public/testing 中调用时得到的。它总是被称为底部的。我试图改变顺序,但最后一个总是被调用。
对此有何解释?还是我做了任何错误的配置?
感谢您的帮助
【问题讨论】:
如果你注释掉最后一个路由会被调用? 按照这个顺序,评论最后一条将获得第二条路线,即通往 TestingController 的路线 该帖子可能指的是具有潜在冲突名称的路由,例如testing/parameter
和 testing/differentlyNamedParameter
因为它们会注册为不同的路由,第一个将在调用 testing/valueForParameter
时解决,当名称相同时,该路由将覆盖以前相同名称和方法的路由
@apokryfos,所以这意味着因为他们三个都有相同的名称“testing”,所以最后一个会覆盖之前的路由?
是的,您可以通过 php artisan route:list
确认这一点。只有三个中的一个会被列出(我希望)。您也可以尝试使用Route::view('testing/optional?', 'welcome');
作为验证这一点的第一条途径。
【参考方案1】:
对此的简短解释是,每次调用 Route::verb
都会在您的路由集合 (relevant code) 下创建一个新的路由条目。 verb
禁止使用任何 HTTP 动词,例如get
或 post
等。此条目是在数组条目 [verb][domain/url]
下创建的。
这意味着当一个新的路由被注册时,它会用相同的方法匹配相同的 URL,它会覆盖旧的。
所以在这种情况下
Route::view('testing', 'welcome')->name('testingWelcome');
Route::get('testing',[TestingController::class, 'noParameter'])->name('testingNoParam');
Route::view('testing', 'dashboard')->name('testingDashboard');
只有第三个声明真正“坚持”。在某些情况下,多个路由定义可以匹配同一个 URL,例如假设您有这些路由:
Route::view('testing', 'welcome')->name('testingWelcome');
Route::get('testing/optionalParameter?',[TestingController::class, 'parameter'])->name('testingNoParam');
Route::view('testing/otherParameter?', 'dashboard')->name('testingDashboard');
在这种情况下,所有 3 个路由都添加到路由集合中,但是当访问 URL example.com/testing
时,first 匹配的路由将是在这种情况下将调用 welcome
视图的路由.这是因为由于声明了所有 3 个路由,一旦路由器找到一个匹配的路由,它就会停止寻找更多的匹配。
注意:使用完全相同的 URL 声明多个路由通常没有意义,因此这主要是一个学术练习。但是,通常有一个用例,例如model/id
和 model/list` 用于区分获取特定模型的信息和获取模型列表。在这种情况下,将路由声明为:
Route::get('model/list', [ ModelController::class, 'list' ]);
Route::get('model/id', [ ModelController::class, 'view' ]);
但是,您可以在路由声明中更明确地使用:
Route::get('model/id', [ ModelController::class, 'view' ])->where('id',
'\d+');
Route::get('model/list', [ ModelController::class, 'list' ]);
在这种情况下,顺序无关紧要,因为 Laravel 知道 id
只能是数字,因此不会匹配 model/list
【讨论】:
感谢@apokryfos 的全面解释。我在上面的解释中添加了更多参数和另一个关键字。并且意识到它看起来像是 Java 中的多态性重载。以上是关于Laravel 8 从下到上的路线顺序的主要内容,如果未能解决你的问题,请参考以下文章