14

我知道浏览器只支持POSTGET请求,而 LaravelPUT使用以下代码支持请求:

<?= Form::open('/path/', 'PUT'); ?>
    ... form stuff ...
<?= Form::close(); ?>

这将产生以下 HTML

<form method="POST" action="http://example.com/home/" accept-charset="UTF-8">
    <input type="hidden" name="_method" value="PUT" />
    ... form stuff ...
</form>

框架如何处理这个问题?它是否在决定将请求发送到哪个路由之前捕获POST请求?它是否使用 ajax 将实际值发送到框架?PUT

4

5 回答 5

50

它插入一个隐藏字段,并且该字段提到它是一个 PUT 或 DELETE 请求

见这里

echo Form::open('user/profile', 'PUT');

结果是:

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

然后它在request.php核心文件中路由时查找 _method(在代码中查找“欺骗”)——如果检测到它——将使用该值路由到正确的 restful 控制器。

它仍然使用“POST”来实现这一点。没有使用ajax。

于 2013-02-07T17:17:40.237 回答
14

Laravel 使用 symfony Http Foundation 来检查这个 _method 变量并根据其内容将请求更改为 PUT 或 DELETE。是的,这发生在路由发生之前。

于 2013-02-07T17:18:51.743 回答
1

PUT 通常指更新请求。

当您使用 laravel Blade 模板打开表单时,

{{ Form::open('/path/', 'PUT') }}

它将在表单内创建一个隐藏字段,如下所示,

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

为了让您在控制器中处理 PUT 请求,您需要创建一个带有 put 前缀的方法,

for example, putMethodName()

所以如果你指定,

{{ Form::open('controller/methodName/', 'PUT') }}

内部形式:打开。然后你需要创建一个控制器方法如下,

class Controller extends BaseController {
    public function putMethodName()
    {
        // put - usual update code logic goes here
    }
}
于 2014-04-26T19:49:49.600 回答
1

您还可以在打开的表单中使用数组,如下所示:

{{ Form::open( array('route' => array('equipment.update', $item->id ),
'role' => 'form',
'method' => 'put')) }}

只需将方法更改为您想要的。

于 2013-11-19T22:59:38.347 回答
1

虽然答案较晚,但我认为对于发现此问题且无法使其 API 工作的任何其他人添加此内容很重要。

像这样使用 Laravel 的资源路由时:

Route::resource('myRoute','MyController');

它将期望 aPUT以调用该update()方法。为了使其正常工作(在表单提交之外),您需要确保将ContentType作为x-www-form-urlencoded传递。这是表单的默认设置,但使用 cURL 或使用Postman等工具发出请求将无法正常工作,除非您设置此选项。

于 2014-02-21T04:20:11.060 回答