为什么 web.php 中的路由由于传入 laravel 8 中的参数而发生冲突

Why route in web.php conflicts due to a parameter passing in laravel 8

我有路线 web.php

Route::get('{cat}',[WebsiteController::class,'dbCategories'])->name('dbCategories');

{cat} 是要显示其产品的特定类别的 slug。

我对这里的另一条路线有疑问

Route::get('blogs',[WebsiteController::class,'show_blogs_toWebsite'])->name('show_blogs_toWebsite');

当我到达这条路线时,它会转到第一条。我怎样才能区分这两个。 请帮我。谢谢。

  1. 您可以通过在 {cat} 之前或之后添加字符串来更改第一条路线 url,例如 Route::get('/category/{cat}',[WebsiteController::class,'dbCategories'])->name('dbCategories')

另外,如果你改变路由的顺序,它会工作得很好

注意:运行 php artisan route:clear 测试前命令

一般情况下,先声明优先权的,例如

Route::get('blogs',[WebsiteController::class,'show_blogs_toWebsite'])->name('show_blogs_toWebsite');
Route::get('{cat}',[WebsiteController::class,'dbCategories'])->name('dbCategories');

您还有一些其他选择,例如在路由处理程序中处理:

Route::get('{cat}',function ($cat) {
    if ($cat === 'blogs') return app()->call([WebsiteController::class,'show_blogs_toWebsite']); 
    return app()->call([WebsiteController::class,'dbCategories']);
});

这样做的缺点是您丢失了路由名称。

另一种方法是指定一个正则表达式来匹配 {cat} 例如

Route::get('{cat}',[WebsiteController::class,'dbCategories'])
    ->name('dbCategories')
    ->where('cat', '^((?!blogs).)*$');
Route::get('blogs',[WebsiteController::class,'show_blogs_toWebsite'])
    ->name('show_blogs_toWebsite');

上面的正则表达式来自