我有一个链接
<a class="trashButton" href="{{ URL::route('user.destroy',$members['id'][$i]) }}" style="cursor: pointer;"><i class="fa fa-trash-o"></i></a>
此链接应该指向Usercontroller的destroy方法,这是我的路由Route::resource('/user', 'BackEnd\UsersController');
UserController是资源控制器。但此时它指示我使用show方法而不是指向destroy方法
答案 0 :(得分:27)
您需要发送DELETE
请求而不是GET
请求。您无法使用链接执行此操作,因此您必须使用AJAX请求或表单。
以下是通用表单方法:
<form action="{{ URL::route('user.destroy', $members['id'][$i]) }}" method="POST">
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<button>Delete User</button>
</form>
如果您使用 Laravel 5.1或更高版本,那么您可以使用Laravel的内置帮助程序来缩短代码:
<form action="{{ route('user.destroy', $members['id'][$i]) }}" method="POST">
{{ method_field('DELETE') }}
{{ csrf_field() }}
<button>Delete User</button>
</form>
如果您使用 Laravel 5.6或更高版本,则可以使用新的Blade指令进一步缩短代码:
<form action="{{ route('user.destroy', $members['id'][$i]) }}" method="POST">
@method('DELETE')
@csrf
<button>Delete User</button>
</form>
的更多信息
答案 1 :(得分:15)
这是因为您通过GET方法而不是DELETE方法请求资源。看:
DELETE /photo/{photo} destroy photo.destroy
GET /photo/{photo} show photo.show
两个路由都具有相同的URL,但标题动词标识要调用的路由。看RESTful table。例如,通过ajax,您可以发送DELETE请求:
$.ajax({
url: '/user/4',
type: 'DELETE', // user.destroy
success: function(result) {
// Do something with the result
}
});
答案 2 :(得分:13)
我使用此模板'resources / views / utils / delete.blade.php'
<form action="{{ $url or Request::url() }}" method="POST">
{{ method_field('DELETE') }}
{{ csrf_field() }}
<button type='submit' class="{{ $class or 'btn btn-danger' }}" value="{{ $value or 'delete' }}">{!! $text or 'delete' !!}</button>
</form>
称为:
@include('utils.delete',array( 'url' => URL::route('user.destroy',$id),'text' => '<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> delete me'))
答案 3 :(得分:9)
如果您希望通过常规链接而不是通过AJAX或其他类型的表单请求来执行此操作,则可以设置一条特殊路由来响应正常的GET
请求:
在您的路线中,除资源外还要定义:
Route::get('user/{site}/delete', ['as' => 'user.delete', 'uses' => 'UserController@destroy']);
在您看来:
<a href="{{ route('user.delete', $user->id) }}">Delete this user</a>
在您的控制器中:
public function destroy(User $user)
{
$user->delete();
return redirect()->route('users.index');
}
答案 4 :(得分:2)
如果我们需要使用锚点来触发销毁路线,并且我们不想使用ajax,我们可以在链接中放置一个表单,并使用onclick
属性提交表单:
<a href="javascript:void(0);" onclick="$(this).find('form').submit();" >
<form action="{{ url('/resource/to/delete') }}" method="post">
<input type="hidden" name="_method" value="DELETE">
</form>
</a>
答案 5 :(得分:1)
如果你真的想通过HTML访问删除路由上的销毁操作,那么有一种方法可以使用HTTP方法欺骗,这意味着您可以通过添加名为_method
的隐藏输入来访问删除HTTP方法“DELETE”的值。相同的方式可用于“PUT”和“PATCH”HTTP方法。
以下是DELETE方法的示例。
<form action="/tasks/5" method="POST">
<input type="hidden" name="_method" value="DELETE">
</form>
将获得路线
DELETE /tasks/{id} destroy tasks.destroy
如果你使用laravel collective,你可以在你的视图中这样写。
{!! Form::open(['url' => '/tasks/'.$cat->id, 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}
答案 6 :(得分:0)
如果您想使用链接,您可以使用我创建的库,让人们可以创建类似POST,DELETE ...调用的链接。
答案 7 :(得分:0)
如果有人来到这里找到如何替换标准laravel表单进行删除,从其中的按钮到链接,你只需要替换:
{!! Form::open(['method' => 'DELETE', 'route' => ['tasks.destroy', $task->id],'onsubmit' => 'return confirm("Are you sure?")', 'id'=>'himan']) !!}
{!! Form::submit('Delete') !!}
{!! Form::close() !!}
要
{!! Form::open(['method' => 'DELETE', 'route' => ['tasks.destroy', $task->id],'onsubmit' => 'return confirm("Are you sure?")', 'id'=>'himan']) !!}
<a href="#" onclick="$(this).closest('form').submit();">Delete</a>
{!! Form::close() !!}
只需使用简单<a href="#"...
替换按钮,但使用onclick
属性即可提交表单!
答案 8 :(得分:0)
GET 和 DELETE 两个路由都有相同的网址,但标题谓词标识要调用的路由。
以下是我的编辑和删除代码段。我使用bootstrap模态确认删除操作
<div class="btn-group">
<a href="{{ route('locations.edit', $location->id) }}"
class="btn btn-default btn-sm">
<i class="fa fa-pencil"></i>
</a>
<span class="btn btn-danger btn-sm formConfirm"
data-form="#frmDelete-{{$location->id}}"
data-title="Delete Location"
data-message="Are you sure you want to delete this Location ?">
<i class="fa fa-times"></i>
</span>
<form method="POST"
style="display: none"
id="frmDelete-{{$location->id}}"
action="{{ route('locations.destroy' , $location->id) }}">
{!! csrf_field() !!}
{{ method_field('DELETE') }}
<input type="submit">
</form>
BootStrap模式
<div class="modal fade" id="formConfirm" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span
class="sr-only">Close</span></button>
<h4 class="modal-title" id="frm_title">Delete</h4>
</div>
<div class="modal-body" id="frm_body"></div>
<div class="modal-footer">
<button style='margin-left:10px;' type="button" class="btn btn-primary col-sm-2 pull-right"
id="frm_submit">Yes
</button>
<button type="button" class="btn btn-danger col-sm-2 pull-right" data-dismiss="modal" id="frm_cancel">
No
</button>
</div>
</div>
</div>
最后JS代码
$('.formConfirm').on('click', function (e) {
e.preventDefault();
var el = $(this);
var title = el.attr('data-title');
var msg = el.attr('data-message');
var dataForm = el.attr('data-form');
$('#formConfirm')
.find('#frm_body').html(msg)
.end().find('#frm_title').html(title)
.end().modal('show');
$('#formConfirm').find('#frm_submit').attr('data-form', dataForm);
});
$('#formConfirm').on('click', '#frm_submit', function (e) {
var id = $(this).attr('data-form');
$(id).submit();
});
答案 9 :(得分:0)
我的非ajax版本。我在资源列表(以及数据表)的下拉菜单(引导程序)中使用它。非常简短且通用。
全局jQuery方法:
$('.submit-previous-form').click(function (e) {
e.preventDefault();
$($(this)).prev('form').submit();
});
然后我们可以在任何地方使用这样的东西:
{{ Form::open(['route' => ['user.destroy', $user], 'method' => 'delete']) }} {{ Form::close() }}
<a href="#" class="dropdown-item submit-previous-form" title="Delete user"><i class="icon-trash"></i> Delete him</a>
推荐:很容易与确认脚本(例如swal)集成。
答案 10 :(得分:0)
你可以试试这个:(你可以传递你的id)
<form action="{{ route('tasks.destroy', $dummy->id) }}" method="post">
@csrf
@method('DELETE')
<a href="#" class="btn btn-danger" title="Delete" data-toggle="tooltip" onclick="this.closest('form').submit();return false;">
<i class="bi bi-trash-fill" style="color:white"></i>
</a>
</form>
需要如下路线:
Route::get('/tasks/delete/{id}', 'TasksController@destroy')
->name('tasks.destroy');
您的控制器:
public function destroy($id)
{
$task = Task::find($id);
$task->delete();
return redirect('/home')->with('success','Task Deleted Successfully');
}
或者你可以试试这个
{!! Form::open(['method' => 'DELETE','route' => ['reports.destroy', $dummy->id],'class'=>'']) !!}
{{ Form::button('<i class="bi bi-trash-fill" style="color:white"></i>', ['type' => 'submit', 'class' => 'delete get-started-btn-two'] ) }}
{!! Form::close() !!}