【问题标题】:How does Laravel handle PUT requests from browsers?Laravel 如何处理来自浏览器的 PUT 请求?
【发布时间】:2015-12-23 20:35:41
【问题描述】:

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

<?= 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 发送到框架?

【问题讨论】:

    标签: laravel


    【解决方案1】:

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

    See here:

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

    结果:

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

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

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

    【讨论】:

    • Request 类来自 Symfony 的 HTTP 协议 HttpFoundation 包装器。 See Symfony's API for Request Class
    • @NBPalomino 在这里的回答应该是公认的答案,因为它实际上回答了潜在的问题。了解 Symfony 对于了解(不是双关语)Laravel 路由的实际工作方式非常重要。
    • @mike 这个问题专门说“Laravel 框架如何处理它”。是的,它使用了 Symfony 组件——但最终是通过 Laravel 实现的。这个问题是通过使用 Laravel Form::open() 提出的——这是一个特定的 Laravel 实现。
    • HTTP 和 HTML 规范确实需要开始包括 PUT 和 DELETE,甚至是 TRACE 和 OPTIONS。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        它需要一个PUT 来调用update() 方法。要使其正常工作(在表单提交之外),您需要确保将 ContentType 作为 x-www-form-urlencoded 传递。这是default for forms,但使用 cURL 或使用Postman 之类的工具发出请求将无法正常工作,除非您设置此选项。

        【讨论】:

          【解决方案5】:

          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
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-26
            • 2020-07-28
            • 2019-06-14
            • 2011-12-30
            • 1970-01-01
            • 2017-05-07
            • 1970-01-01
            相关资源
            最近更新 更多