Laravel 冲突路线

Laravel conflicting routes

我的 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 请求中的 'trash' 字符串混淆为 {id} 参数。因此,将调用 destroy() 方法而不是 emptyTrash()。为什么以及我可以为此做什么?

在您的视图中的某处,您应该有一个按钮或 link 用于实际删除 post。视图应如下所示:

@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'));

你实际删除posts的路由名称为'delete_post'.

清空垃圾的路线名称将是empty_trash

基本上你明确定义了你的路线,这样你就可以避免歧义,Laravel 就会知道要走哪条路线。希望这些信息对您有所帮助!

首先,订单很重要。 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]+');