【问题标题】:How to make a delete request with Laravel如何使用 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;

标签: php html laravel web


【解决方案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')}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2016-02-16
    相关资源
    最近更新 更多