在 Laravel 5.4 的路由中使用 DELETE 方法

Posted

技术标签:

【中文标题】在 Laravel 5.4 的路由中使用 DELETE 方法【英文标题】:use DELETE method in route with Laravel 5.4 【发布时间】:2017-10-22 04:14:10 【问题描述】:

我正在开发一个 Laravel (v 5.4) 项目,我使用 CRUD 来管理类别。目前,我可以创建一个新类别并且可以删除。

我创建了视图(带有刀片)来删除类别:

<table class="table">
  <thead>
    <th>Name</th>
    <th>Action</th>
  </thead>
  <tbody>
    @foreach ($categories as $category)
      <tr>
        <td>$category->name</td>
        <td>
          <a href=" url('/categories', ['id' => $category->id]) ">
            <button class="btn btn-default">
            Delete
            </button>
          </a>
        </td>
      </tr>
    @endforeach
  </tbody>
</table>

在路由文件 web.php 中,我写道:

Route::delete('/categories/id', CategoryController@destroy);

我有一个控制器 CategoryController 和一个方法 destroy() 删除类别并重定向到类别列表。但是当我点击删除按钮时,我得到一个错误,说明这条路线没有定义。如果我用Route::get 替换Route::delete,它就可以工作。我认为 url 是用 GET 调用的,但我会保留它以进行其他操作。

我尝试将链接替换为表单和“DELETE”作为“方法”属性的值,但没有成功。

如何使用 DELETE 方法调用 url 以使用 Route::delete 捕获它?

提前致谢。

【问题讨论】:

【参考方案1】:

如果你点击一个 url,它总是一个 GET 方法。

既然你想把它定义为DELETE,你应该把它改成一个post form并添加

<input type="hidden" name="_method" value="delete" />

在里面。喜欢替换:

<a href=" url('/categories', ['id' => $category->id]) ">
    <button class="btn btn-default">Delete</button>
</a>

与:

<form action=" url('/categories', ['id' => $category->id]) " method="post">
    <input class="btn btn-default" type="submit" value="Delete" />
    <input type="hidden" name="_method" value="delete" />
    <input type="hidden" name="_token" value=" csrf_token() ">
</form>

PUT 请求也是如此。

Laravel 5.1 方法字段:

<form action=" url('/categories', ['id' => $category->id]) " method="post">
    <input class="btn btn-default" type="submit" value="Delete" />
    !! method_field('delete') !!
    !! csrf_field() !!
</form>

Laravel 5.6 开始只有 @ 标签:

<form action=" url('/categories', ['id' => $category->id]) " method="post">
    <input class="btn btn-default" type="submit" value="Delete" />
    @method('delete')
    @csrf
</form>

【讨论】:

【参考方案2】:

对于 laravel 5.7,请看我的例子:

<form action="route('statuses.destroy',[$order_status->id_order_status])" method="POST">
 @method('DELETE')
 @csrf
 <button type="submit">Delete</button>               
</form>

【讨论】:

【参考方案3】:

GETPOST 以外的任何方法都需要您使用隐藏的表单输入来指定方法类型。这就是 laravel 检测它们的方式。在您的情况下,您需要使用表单发送删除操作。这样做。

<table class="table">
    <thead>
    <th>Name</th>
    <th>Action</th>
    </thead>
    <tbody>
    @foreach ($categories as $category)
        <tr>
            <td>$category->name</td>
            <td>
                <form action="/categories/ $category->id " method="post">
                     method_field('delete') 
                    <button class="btn btn-default" type="submit">Delete</button>
                </form>
            </td>
        </tr>
    @endforeach
    </tbody>
</table>

【讨论】:

以上是关于在 Laravel 5.4 的路由中使用 DELETE 方法的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 - 如何覆盖包中定义的路由?

用于删除sql行的按钮:Laravel 5.4上的BadMethodCallException

Laravel 5.4 通过子域运行所有路由

Angular 4 和 Laravel 5.4 的刷新路由问题

Laravel 5.4 路由器中的条件设置控制器

在 Laravel 5.4 中将中间件应用于除 `setup/*` 之外的所有路由