【问题标题】:How exactly is Laravel PUT,PATCH,POST implementation?Laravel PUT、PATCH、POST 的实现究竟如何?
【发布时间】:2021-07-08 12:16:47
【问题描述】:

我已经阅读了很多关于 HTTP 方法差异和确切优势的资源 据我所知,这似乎是一份更好地理解和使用 REST API 的合同。 我的困惑如下:

我有一个表格:

  <form action="{{ route('test') }}" method="POST">
        @csrf
        @method('PUT')
        <input type="text" name="input1" >
        <input type="text" name="input2" >
        <button type="submit">send </button>
    </form>

我有一张这样的桌子:

| id | input1 | input2 | input3

| -- | -----  | ------ |----|

| 1  |   100  |  220   |  400    

在控制器中,我更新了我们发送的所有请求字段。

  public function test(Request  $request)
    {
      return  Setting::find(1)->fill( $request->all())->save();
    }

所有 PUT、PATCH、POST 方法的工作方式都相同。
如果应该完全重新生成资源,PUT 不会将 input3 更改为 NULL。 并且 PATCH 更改 input1 和 input2。 POST 也一样,因为我记下了资源 ID。

问题是,确切的 DIFF 是多少? 资源告诉我们:

create - POST
read - GET
update - PUT
modify - PATCH
delete - DELETE

虽然我们可以使用 POST 更新、修改甚至删除。 当我们使用表单请求时,发送的数据是完全一样的。

我们听说 PUT 方法完全重新生成资源,但它没有发生,它只更新 DB 中的已发送字段(仅更新了上例中的 Input1 和 input2)
我认为当我们不使用所有输入的表单以及部分发送数据时它们会起作用。 在实现上是否还有其他深刻而明显的差异?

【问题讨论】:

  • 请分享更多关于您的问题的详细信息 - Laravel 是开源的,所以如果您想知道它是如何实现的,何不阅读他们的代码?
  • @NicoHaase 我刚刚更新了

标签: laravel patch put http-method


【解决方案1】:

我认为你对 HTTP 请求方法的理解有误。当然,它们都有区别,但不是你所指向的。

create - POST
read - GET
update - PUT
modify - PATCH
delete - DELETE 

上面的几行说你必须使用一种特殊的 HTTP 方法来进行一种特殊的操作。这是否意味着我不能使用 GET 来删除资源?不,它没有。从技术上讲,对于所有资源操作,您可以只使用一种具有不同 URL 的 HTTP 方法。当然,这是不好的做法,但这是可能的。 HTTP 方法只显示了如何 send 数据从客户端到服务器,但不显示如何将 processing on server

那么为什么我们必须对不同类型的操作使用不同的方法呢? 有一些现有的规则,他们说: 使用 POST 进行创建,使用 PUT 进行更新等。如果您创建自己的应用程序,您希望它能够存活很长时间并且其他开发人员会维护它,如果您坚持一般规则,维护您的系统会简单得多。此外,不同的方法可以发送具有不同安全级别的数据,您必须意识到这一点。

【讨论】:

  • 感谢您的反馈,我在上面提到了我认为这就像您所说的更好理解的合同,现在我的问题是我们必须自己管理服务器中的 PUT 语义?我们必须自己再生资源吗?我的错误理解来自这里,我认为 PUT 方法会自行重新生成记录的所有列。
  • 两个问题都是。你必须自己处理这一切。 I thought PUT method regenerates all columns of the a record by itself. - 不,它没有在 laravel 中实现
【解决方案2】:

希望这对您有所帮助。

当我们使用 POST、PUT、PATCH 和 DELETE 时

我们可以有这样的路由路径:

'/comments'

同样的路由会处理所有问题:POST、PUT、PATCH 和 DELETE

如果没有,我们会成功的:

'/cmets/add', '/cmets/删除', '/cmets/更新', '/cmets/create'

当我们这样做时,我们可以选择使用一个控制器来处理该路由以及处理每种请求类型的方法,我们甚至可以继续添加中间件并将某些功能限制为某些具有特定角色的用户。如果不是,某些方法(函数)可能会太长。使方法简单而小巧也是最佳实践。

Link to similar post on stackoverflow

【讨论】:

    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2013-10-27
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多