【发布时间】:2023-03-09 14:00:01
【问题描述】:
对于使用Route::resource 将路由定义为资源,文档指出:
Verb Path Action Route Name
-------------------------------------------------------------------
GET /resource index resource.index
GET /resource/create create resource.create
POST /resource store resource.store
GET /resource/{resource} show resource.show
GET /resource/{resource}/edit edit resource.edit
PUT/PATCH /resource/{resource} update resource.update
DELETE /resource/{resource} destroy resource.destroy
根据典型的 REST CRUD,因此 PUT/PATCH 用于更新操作,DELETE 用于销毁操作。我认为这是为了定义典型的资源交互,即使手动定义我自己的路由和控制器操作也是如此。
以下是我对这些与 Laravel 交互的理解的核心:
- 你可以定义一个路由来接受
Route::put的PUT和Route::delete.的DELETE -
Input门面使用Illuminate\Http\Request::input典型交互,并将返回json_decode的json 内容、GET 请求的所有GET 参数或所有POST 参数。我们必须使用 json 或根本不使用 PUT 或 DELETE(很好,因为 http PUT 和 DELETE 请求不被普遍支持)。 -
Laravel's own form helpers use POST for PUT and DELETE requests, including a
_methodin the data so that the routing can enforce the verbs。
PUT 和 DELETE 仅仅是为了创建外部可访问的 json REST API,还是用于其他目的?除了使用不同的端点路由到相同的 URI,强制在 $_POST 或 json 中存在 _method 之外,还有其他好处吗?
PUT 和 DELETE 应该是幂等的,但这甚至在 Laravel 中实现了吗?这是我必须在我的控制器中发生的事情,还是路由以某种方式强制执行?
本质上,如果 Laravel 中的 PUT 和 DELETE 在功能上与 POST 相同,除了 REST 语义和并行路由之外,我何时以及为什么应该在 POST 上使用它们?
【问题讨论】:
-
答案包含在您的问题中 - 如果您需要这些动词,则在处理 RESTful 操作时应该使用 PUT 和 DELETE。与所有事情一样 - 您实际上不必这样做。
-
我试图通过包含场景的完整描述来明确问题,但你说得对,它是领先的。您的回答是,是的,它们仅用于外部 REST API,除了符合 REST 交互模型的标准动词之外,它们没有任何好处?没有幂等性或其他含义?在内部,我可以对同一个函数使用 POST 和不同的 URI。多么令人失望。关于缺乏幂等性的任何来源?如果你能把它作为答案,我可以接受。
-
简答:清晰。如果您正在进入一个新项目并浏览 Routes 以查看正在发生的事情,并且您会看到
route::post,那么您真正知道的就是该路线上发布了一些东西。如果您看到route::delete,您就知道在该操作结束时,应该删除某些内容。 Laravel 的首要原则之一是确保代码具有表现力。 -
虽然 HTML 表单只支持 GET 和 POST,但几乎所有的 AJAX 实现都支持 PUT 和 DELETE。 stackoverflow.com/questions/8785248/…
-
@JamesBinford 这就是我所说的“REST 语义”和“符合 REST 交互模型的标准动词”的意思。这都是语义的。如果路由具有描述性 URI 和/或映射到描述性控制器操作,那么它也应该是清楚的。当然,它会强制
_method与这些动词的存在,但是当它缺乏分隔背后的功能(在这种情况下是幂等性)时,它实际上变得纯粹是语义,类似于许多简单地解析为 s 最后,只会膨胀源。