在 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】:GET
和POST
以外的任何方法都需要您使用隐藏的表单输入来指定方法类型。这就是 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 方法的主要内容,如果未能解决你的问题,请参考以下文章
用于删除sql行的按钮:Laravel 5.4上的BadMethodCallException