Laravel 表单不会 PATCH,只有 POST - 嵌套的 RESTfull 控制器,MethodNotAllowedHttpException

Posted

技术标签:

【中文标题】Laravel 表单不会 PATCH,只有 POST - 嵌套的 RESTfull 控制器,MethodNotAllowedHttpException【英文标题】:Laravel form won't PATCH, only POST - nested RESTfull Controllers, MethodNotAllowedHttpException 【发布时间】:2014-11-09 13:07:03 【问题描述】:

我正在尝试允许用户编辑他们的播放列表。但是,每当我尝试执行 PATCH 请求时,都会收到 MethodNotAllowedHttpException 错误。 (它正在等待一个 POST)

我已经设置了 RESTful 资源控制器:

Routes.php

Route::resource('users', 'UsersController');
Route::resource('users.playlists', 'PlaylistsController');

这应该让我可以访问:(通过 php artisan routes 显示)

URI                                        | Name                   | Action
PATCH users/users/playlists/playlists  | users.playlists.update | PlaylistsController@update

但是,当我尝试执行以下表单时,我收到 MethodNotAllowedHttpException 错误:

/users/testuser/playlists/1/edit

 Form::open(['route' => ['users.playlists.update', $playlist->id], 'method' => 'PATCH' ]) 
 Form::text('title', $playlist->title) 
 Form::close() 

如果我删除'method'=> 'PATCH',我不会收到错误,但它会执行我的public function store(),而不是我的public function update()

【问题讨论】:

【参考方案1】:

在表格后写!! method_field('patch') !!

<form method="POST" action="patchlink">
     !! method_field('patch') !!
     . . .
</form>

Official documentation for helper function method_field()

【讨论】:

【参考方案2】:

在 Laravel 5 及更高版本中:

<form method="POST" action="patchlink">
    @method('patch')
    . . .
</form>

【讨论】:

【参考方案3】:

由于 html 表单仅支持 GETPOST 您需要添加一个额外的隐藏字段 到名为_method 的表单,以模拟PATCH 请求

<input type="hidden" name="_method" value="PATCH">

【讨论】:

PATCH 正在通过 Form::open 中的方法选项添加。您也可以使用 PUT。我遇到了同样莫名其妙的问题,无论我做什么,PUT 或 PATCH 方法都会抛出 MethodNotAllowedHttpException。非常令人沮丧。 尝试使用Route::any('the_url_where_you_post_to', function()); 或根据您使用的方法Route::patchRoute::put【参考方案4】:

正如@Michael A 在上述评论中所建议的那样,将其作为 POST 发送

<form method="POST" action="patchlink">
     <input type="hidden" name="_method" value="PATCH">

为我工作。

【讨论】:

以上是关于Laravel 表单不会 PATCH,只有 POST - 嵌套的 RESTfull 控制器,MethodNotAllowedHttpException的主要内容,如果未能解决你的问题,请参考以下文章

405 方法不允许,PATCH 不工作。 Laravel、Ajax、Jquery、引导模式

Laravel 5.4方法不允许补丁

Laravel 5 表单模型绑定复选框值

laravel中的表单请求类型和CSRF防护

在 Laravel 的 POST 表单上发送信息时出错

Laravel 8 数据库不会使用 HTML 表单更新