如何使用 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 发出删除请求的主要内容,如果未能解决你的问题,请参考以下文章