Php URL打错了控制器LARAVEL

Php URL打错了控制器LARAVEL,php,laravel,controller,routes,Php,Laravel,Controller,Routes,在route.php中,我定义了一条到控制器的路由,上面有2个令牌 Route::get('/{category}/{slug}', 'projectController@detail'); 在调用具有相同结构但与下面所示的路由必须捕获的URL无关的URL之前,一切都正常工作 例如,当我有“/admin/tags”,下面的控制器会被触发,因为它的结构与“/{category}/{slug}”相同,当然它会给我一个错误,因为它找不到变量 所以现在我修复了移动底部路径的问题,但我相信我必须提前做些

在route.php中,我定义了一条到控制器的路由,上面有2个令牌

Route::get('/{category}/{slug}', 'projectController@detail');
在调用具有相同结构但与下面所示的路由必须捕获的URL无关的URL之前,一切都正常工作

例如,当我有
“/admin/tags”
,下面的控制器会被触发,因为它的结构与
“/{category}/{slug}”
相同,当然它会给我一个错误,因为它找不到变量

所以现在我修复了移动底部路径的问题,但我相信我必须提前做些事情来防止这种行为,因为如果我有多条带有不同令牌的路径,每次都会触发所有事件,并且会造成混乱

那么,在这些情况下它应该做什么呢


另外,我是Laravel的超级初学者

对路线使用一些约束,参考。例如:

Route::get('user/{name}', function ($name) {
    //
})
->where('name', '[A-Za-z]+');
或者你可以在非具体的之前先做最具体的。例如,在此序列中:

Route::get("/admin/tags", '......');
Route::get('/{category}/{slug}', 'projectController@detail');

若路由需要两个这样的令牌,我通常会添加前缀,所以我的路由看起来像这样

Route::get('/categories/{category}/slug/{slug}', 'ProjectController@detail');


我也有同样的问题。 我对每个路径参数都有约束(您应该总是这样),不幸的是,以下参数之间会发生冲突:

Route::get('{userId}/{path}', [
    'as' => 'products',
    'uses' => 'HomeController@click'
])->where(['id' => '[0-9]+', 'path' => '[0-9a-fA-F]+']);

Route::get('link/{link_path}', [
    'as' => 'product-link',
    'uses' => 'UserController@productLink'
])->where(['link_path' => '[0-9a-fA-F]+']);
其中,即使一条路径在路径中有前缀“link/”,它仍然试图击中另一条路径。通过将带有预先设置的“链接/”的路线置于另一条路线之上,它获得了优先权并起作用

就我个人而言,我认为如果你有一个条件在route where子句中没有得到满足,那么它应该跳过这个过程,继续下一个过程。对我来说,如果不满足条件,就不可能放弃一个条件,这是没有意义的


希望这能帮助其他有此问题的人。

如果您有这样的路线(如通配符路线),最好总是将其放在路线的底部。
Route::get('{userId}/{path}', [
    'as' => 'products',
    'uses' => 'HomeController@click'
])->where(['id' => '[0-9]+', 'path' => '[0-9a-fA-F]+']);

Route::get('link/{link_path}', [
    'as' => 'product-link',
    'uses' => 'UserController@productLink'
])->where(['link_path' => '[0-9a-fA-F]+']);