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]+');
我的 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]+');