如何使用 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传递一个隐藏的输入来删除路由:&lt;input name="_method" type="hidden" value="DELETE"&gt; 【参考方案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 中,可以在表单中为 csrfmethod 使用刀片指令,例如:

<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 库删除项目

如何在不使用请求的情况下删除 Laravel 5.3 中的会话?

如何在 laravel 中使用不记名令牌从 api 请求中获取响应?