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/parametertesting/differentlyNamedParameter 因为它们会注册为不同的路由,第一个将在调用 testing/valueForParameter 时解决,当名称相同时,该路由将覆盖以前相同名称和方法的路由 @apokryfos,所以这意味着因为他们三个都有相同的名称“testing”,所以最后一个会覆盖之前的路由? 是的,您可以通过 php artisan route:list 确认这一点。只有三个中的一个会被列出(我希望)。您也可以尝试使用Route::view('testing/optional?', 'welcome'); 作为验证这一点的第一条途径。 【参考方案1】:

对此的简短解释是,每次调用 Route::verb 都会在您的路由集合 (relevant code) 下创建一个新的路由条目。 verb 禁止使用任何 HTTP 动词,例如getpost 等。此条目是在数组条目 [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 从下到上的路线顺序的主要内容,如果未能解决你的问题,请参考以下文章

基本切换()从下到上的幻灯片问题

聊天应用程序的从下到上的布局设计

从下到上的动画边框颜色变化?

如何使用 C 从下到上读取行?

列表项从下到上删除,但不是从上到下

从下到上显示元素,如 facebook 消息