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()
.为什么以及我能为此做些什么?
首先,订单很重要.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)