我的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'
]);
});
我的PostsController.php
摘录:
/**
* DELETE /admin/posts/{id}
*/
public function destroy($id)
{
// code
}
/**
* DELETE /admin/posts/trash
*/
public function emptyTrash()
{
// code
}
问题在于,Laravel将DELETE /admin/posts/trash
请求中的“垃圾”字符串混淆为{id}
参数。因此,调用destroy()
方法而不是emptyTrash()
。为什么以及我能为此做些什么?
答案 0 :(得分:6)
首先,订购事项。 Laravel将按照您注册的顺序在路线中搜索匹配项。如您所知,Laravel将trash
作为id,因此URI与资源路由匹配。由于该路由在之前注册,因此它将使用资源路由。
最简单的解决方法是改变顺序:
Route::delete('posts/trash', [
'as' => 'posts.trash.empty',
'uses' => 'PostsController@emptyTrash'
]);
Route::resource('posts', 'PostsController', [
'except' => ['show']
]);
如果您不喜欢,可以尝试将资源路径的参数限制为仅限数字。不幸的是,您不能像在其他人一样添加->where()
到资源路径。
相反,您必须为路由参数定义global pattern。路由参数Route::resource
选择的是资源名称(以snake_case为单位)。
所以这对你有用:
Route::pattern('posts', '[0-9]+');
答案 1 :(得分:0)
在您看来的某个地方,您应该有一个按钮或链接来实际删除帖子。视图应如下所示:
@section('content')
<div class="panel panel-default">
<div class="panel-heading clearfix">
<b>{{ $post->post_name . ' (id:' . $post->post_id . ')' }}</b><br />
<b> {{ link_to_route('overview', 'Go Back To Post List') }} </b>
<div class="pull-right">
// FORM FOR DELETING POST
{{ Form::open(array('route' => array('delete_post', $post->post_id))) }}
{{ link_to_route('edit_post', 'Edit Post', array('id' => $post->post_id), array('class' => 'post_img_button_edit')) }}
{{ Form::hidden('_method', 'DELETE') }}
{{ Form::submit('Delete Post', array('class' => 'post_img_button_delete')) }}
{{ Form::close() }}
</div>
<div class="pull-right">
// FORM FOR EMPTYING TRASH
{{ Form::open(array('route' => 'empty_trash')) }}
{{ Form::hidden('_method', 'DELETE') }}
{{ Form::submit('Empty Trash', array('class' => 'post_img_button_delete')) }}
{{ Form::close() }}
</div>
</div>
/* Additional HTML code within view */
您的控制器应与此类似:
public function destroy($id)
{
$this->post->delete($id);
return \Redirect::route('overview');
}
public function emptyTrash()
{
// code for collecting and emptying Trash
}
您的路线应该与此类似:
Route::delete('admin_posts/admin_posts/{id}/destroy', array('as'=>'delete_post', 'uses'=>'PostsController@destroy'));
Route::delete('posts/trash', array('as'=>'empty_trash', 'uses'=>'PostsController@emptyTrash'));
实际删除帖子的路线名称为'delete_post'。
清空垃圾箱的路线名称将为 empty_trash
基本上你明确地定义了你的路线,这样你就可以避免不那么模糊,Laravel会知道要走哪条路线。希望这些信息有所帮助!