[英]CRUD Laravel 5 how to link to destroy of Resource Controller?
我有链接
<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 方法
您需要发送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>
您可以在此处阅读有关Laravel 中方法欺骗的更多信息。
这是因为您通过 GET 方法而不是 DELETE 方法请求资源。 看:
DELETE /photo/{photo} destroy photo.destroy
GET /photo/{photo} show photo.show
两条路由具有相同的 URL,但标头动词标识要调用的路由。 看起来是RESTful 表。 例如,您可以通过 ajax 发送 DELETE 请求:
$.ajax({
url: '/user/4',
type: 'DELETE', // user.destroy
success: function(result) {
// Do something with the result
}
});
我使用这个模板'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'))
如果您希望通过常规链接而不是通过 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');
}
如果我们需要使用anchor来触发destroy路由,又不想使用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>
如果你真的想通过HTML访问delete路由上的destroy动作,那么有一种使用HTTP Method Spoofing的方法,这意味着你可以通过添加一个名为_method
且值为`"DELETE"的隐藏输入来访问delete HTTP方法. 相同的方式可用于“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集体,你可以在你的观点中这样写。
{!! Form::open(['url' => '/tasks/'.$cat->id, 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}
如果有人来这里寻找如何替换标准 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
属性来提交表单!
如果你想使用一个链接,你可以使用我创建的一个库,它可以让人们创建行为类似于 POST、DELETE... 调用的链接。
GET和DELETE两条路由具有相同的 URL,但标头动词标识要调用的路由。
这是我用于编辑和删除的代码片段。 我使用引导模式确认进行删除操作
<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>
引导模式
<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();
});
我的非 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。
你可以试试这个:(你可以传递你的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() !!}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.