在Laravel 5.5项目中,我有一个带有destory
方法的学生控制器。
public function destroy(Student $student)
{
//destroy $student and redirect
}
我有控制器的路由如下
Route::delete('/student/{id}', 'StudentController@destroy');
现在让我们进入问题。
我有一个管理学生的页面,它有一个删除按钮。
<a class="btn btn-danger"
href="{{ action('StudentController@destroy', ['id' => $student->id]) }}" >
Delete
</a>
当我单击删除按钮时,它会抛出method not allowed exception
因为该请求不是删除请求。有什么方法/解决方法可以通过action()/route()
帮助程序函数指定/欺骗请求方法?
通常我会创建一个带有隐藏_method="delete"
输入的表单并发布表单。 但是,如果要添加更新按钮,那么我将不得不创建另一个带有隐藏_method="patch"
的表单,我认为这不是一个好的做法。
请给出一些想法。
回答您的问题 - 是的,您应该创建允许您删除学生的表单。这就是应该使用 REST 的方式 - 您不会创建解决方法,而只是对给定操作使用有效的 HTTP 方法。
还有一个原因,为什么你不应该为此使用链接和GET方法。例如,假设您要删除学生的 URL 如下所示:
http://example.com/students/1/delete
当您在浏览器中键入 url 时,浏览器通常会记住以前的 url,因此如果您使用 GET 方法删除学生,您可能会错误地删除一些学生。
当然,在上面的例子中,你可以使用JavaScript,当你点击将运行有效HTTP操作的链接时,它将启动,但这可能意味着比使用简单的表单更多的工作。
我能想到两种方法:
-
使用方法 DELETE 创建表单
{!! Form::model($student, ['method' => 'DELETE', 'action' => ['StudentController@destroy', $student->id]]) !!} {!! Form::submit('Delete', ['class' => 'btn btn-danger']) !!} {!! Form::close() !!}
-
创建请求类型为 DELETE 的 ajax 请求
$.ajax({ url: '/students/'+id+'/delete, type: "DELETE", data:{ _token: "{{ csrf_token() }}" } });