URL命中错误的控制器LARAVEL

时间:2016-12-16 03:03:34

标签: php laravel controller routes

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

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

一切正常,直到调用一个具有相同结构但与必须被下面显示的路径捕获的URL无关的URL。

所以当我有例如"/admin/tags"时,下面的控制器被触发,因为它具有"/{category}/{slug}"的相同结构,当然它给了我一个错误,因为它没有找到变量

所以现在我修复了在底部移动该路线的问题,但我相信我必须提前做一些事情以防止这种行为,因为如果我有多个具有不同令牌的路线,那么每次都会触发一切,并且会有一团糟。

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

P.S。我是Laravel的超级初学者

3 个答案:

答案 0 :(得分:2)

对路线使用一些约束,引用parameters-regular-expression-constraints。例如:

Route::get('user/{name}', function ($name) {
    //
})
->where('name', '[A-Za-z]+');

或者你可以在非特定之前做出最具体的信息。例如,按以下顺序:

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

我遇到了同样的问题。 我对每个路径参数都有约束(正如你一直应该的那样),不幸的是,冲突发生在以下几个:

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]+']);

即使一条路径有前置链接/'在路径上它仍然试图击中另一个。通过放置前置'链接/'在其他路线之上,它优先并且有效。

就我个人而言,如果你有一个条件在路线where子句上没有遇到它应该跳过路线并继续下一个路线。如果条件不满足,那么设置一个实际上没有通过的条件对我来说真的没有意义。

希望这可以帮助其他人解决这个问题。