如何使用 Laravel 发出删除请求
Posted
技术标签:
【中文标题】如何使用 Laravel 发出删除请求【英文标题】:How to make a delete request with Laravel 【发布时间】:2017-12-06 21:23:36 【问题描述】:我没有使用资源控制器。
路线:
Route::delete('/deleteTag/tag','Controller2@deleteTag');
控制器功能:
public function deleteTag(Tag $tag)
$Tag = Tag::where('id', $tag->id)->get()->first();
$Tag->delete();
return redirect()->action('Controller2@main');
电话:
<form method="delete" action="http://***/public/deleteTag/$tag->id">
!! Form::token() !!
<button type="submit">delete</button>
</form>
程序返回 MethodNotAllowedHttpException。
谢谢。
【问题讨论】:
你使用的是什么版本的 Laravel?另外,为什么你的网址中有“公共”? 我认为delete
不是一个有效的html方法,你应该使用post
然后为laravel传递一个隐藏的输入来删除路由:<input name="_method" type="hidden" value="DELETE">
【参考方案1】:
你可以试试这个(注意隐藏的_method
输入):
<form method="post" action="http://***/public/deleteTag/$tag->id">
!! Form::token() !!
<input type="hidden" name="_method" value="DELETE">
<button type="submit">delete</button>
</form>
检查Form Method Spoofing。
更新:
在最新版本的 Laravel 中,可以在表单中为 csrf
和 method
使用刀片指令,例如:
<form method="post" action="...">
@csrf
@method('DELETE')
<button type="submit">delete</button>
</form>
【讨论】:
laravel/blade 提供了 csrf 令牌和隐藏方法的简写:@csrf
和 @method('DELETE')
laravel docs
谢谢,我知道,但是当给出答案时,那些没有实现:-)
很高兴知道!您可以根据新功能编辑答案【参考方案2】:
最好把你的路线改成这种模式:
Route::resource('tags','TagController');
您应该向控制器注册一个资源丰富的路由。这个单一的路由声明创建了多个路由来处理标签资源上的各种 RESTful 操作。 请记住,由于 HTML 表单无法发出 PUT、PATCH 或 DELETE 请求,因此您需要添加一个隐藏的 _method 字段来欺骗这些 HTTP 动词。
<input type="hidden" name="_method" value="DELETE">
或将其添加到您的表单中
method_field('DELETE')
【讨论】:
以上是关于如何使用 Laravel 发出删除请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 GET url
如何在 Vue.js 和 Laravel 5.4 中发出 POST 请求
如何在 Laravel 中在一秒钟内发出并发请求时避免重复记录
如何在 Laravel 中使用 HTTP 请求的删除方法通过外部 Api 库删除项目