我要试试这个。我自己也在学习这方面的知识,所以如果有任何错误的信息,请纠正我。
在可扩展性方面,您应该始终能够独立创建任何模型,即使此时它似乎并不是绝对必要的。 REST 范式恰恰代表了这一点:每个模型(又名资源)都有自己的 CRUD 端点(子)集,客户端应用程序可以使用这些端点对任何数据组合(基本实体所在的组合)执行任何操作主要是您指定的模型)。
此外,模型应该只关注其自己的数据,并且该数据通常位于单个表中(在关系数据存储的情况下)。在许多情况下,模型指定了读取相关资源的工具,以便在请求时可以包含这些数据。这可能类似于下面的行,理想情况下,响应完全符合JSON API specification:
GET //api/my-resources/1?include=related-resource
但是,模型不应该创建 (POST)、更新 (PUT) 或删除 (DELETE) 这些关系,在没有明确说明的情况下根本不应该这样做。
如果您有一个要在单步执行 中创建模型及其嵌套模型(我假设相关模型)的过程,则可以为此操作创建一个额外的端点。您必须为该组资源想出一个合理的名称,并在整个应用程序的 HTTP/支持层中使用它。例如,要创建这样一组资源,请求可能是:
POST //api/sensible-name { your: 'data' }
保留{ your: 'data' }
部分尽可能接近典型的 JSON API 格式,最好完全兼容。然后,在您的后端(我想是 Laravel,在您的情况下),您想要创建一个可能称为 <SensibleName>Factory 的 factory implementation,它负责弄清楚如何将发布的数据映射到不同的模型,并且如何指定它们的关系。在底层,这个工厂只是使用模型类的创建工具将您带到您想去的地方。
当您在模型中自动执行此过程时,将无法独立创建资源。
当您改为在任何不符合 REST 范例的单一资源控制器中自动执行此过程时。
使用工厂模式,您可以显式使用该类来执行更高级别的操作,上述问题均不适用,更不用说这种方法是否符合 REST。
关键的一点是,通过对单一资源端点执行多个请求,必须仍然可以实现完全相同的结果,并且为了方便起见,您的额外 /api/sensible-name 端点只是替代了调用这些多个端点的需要,当您确实想一次性创建多个记录时。
请注意,我的陈述与创建哪些端点来获取嵌套资源无关。 This SO question 就什么是可以接受的,以及您的具体需求可能如何与之相关进行了一些很好的对话。
归根结底,一切都取决于对您和您的应用程序有效的方法,而 REST 等只是向您提出尽可能满足一般 Web 开发中类似需求的方法的理念。