Laravel相互冲突的路线

Ant*_*dis 1 php routes laravel laravel-5

我的routes.php摘录:

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {

    Route::resource('posts', 'PostsController', [
        'except' => ['show']
    ]);

    Route::delete('posts/trash', [
        'as' => 'posts.trash.empty',
        'uses' => 'PostsController@emptyTrash'
    ]);

});
Run Code Online (Sandbox Code Playgroud)

我的PostsController.php摘录:

/**
 * DELETE /admin/posts/{id}
 */
public function destroy($id)
{
    // code
}

/**
 * DELETE /admin/posts/trash
 */
public function emptyTrash()
{
    // code
}
Run Code Online (Sandbox Code Playgroud)

问题是Laravel将DELETE /admin/posts/trash请求中的'trash'字符串混淆为{id}参数.因此,destroy()调用该方法而不是emptyTrash().为什么以及我能为此做些什么?

luk*_*ter 6

首先,订单很重要.Laravel将按照您注册的顺序在路线中搜索匹配项.正如您所知,Laravel将trash作为id,因此URI与资源路由匹配.由于该路由您的额外路由之前注册,因此它将使用资源路由.

最简单的解决方法是更改​​该顺序:

Route::delete('posts/trash', [
    'as' => 'posts.trash.empty',
    'uses' => 'PostsController@emptyTrash'
]);

Route::resource('posts', 'PostsController', [
    'except' => ['show']
]);
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢,可以尝试将资源路由的参数限制为仅限数字.不幸的是,您不能->where()像其他人那样只添加资源路径.

相反,您必须为route参数定义全局模式.route参数Route::resource选择的是资源名称(以snake_case为单位).

所以这对你有用:

Route::pattern('posts', '[0-9]+');
Run Code Online (Sandbox Code Playgroud)