Laravel相互冲突的路线

时间:2015-01-29 20:49:21

标签: php laravel routes 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'
    ]);

});

我的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()。为什么以及我能为此做些什么?

2 个答案:

答案 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会知道要走哪条路线。希望这些信息有所帮助!