【问题标题】:MVC + REST + nested resources + single page appMVC + REST + 嵌套资源 + 单页应用
【发布时间】:2017-08-26 23:59:16
【问题描述】:

我是一个新手,但我在努力实现这个交互式应用程序我正在以“正确的方式”工作,或者至少在可扩展性、可维护性、模块化、开发速度和工具独立性方面是一个很好的方式。这就是我选择 REST 设计指南和实现 MVC 的框架的原因。

但是,在以下情况下,我不知道该把什么放在哪里,如果有经验丰富的开发人员在此技术方面提供的任何输入或阅读材料,我将不胜感激:

我正在开发一个单页网络应用程序,它创建一个包含多个嵌套资源的资源。在创建方法等中,我需要从嵌套资源中调用创建方法。现在,每个 GET 请求都以 JSON 响应,然后前端对其进行解析、显示并相应地动态添加到页面中。问题是:从嵌套资源中创建和存储方法应该在哪里,在控制器中还是在模型中?

目前,我的方法是:由于控制器功能是处理用户输入,与模型交互并相应地返回视图,因此嵌套的存储方法在模型中,因为它们不是独立创建的,它们的创建方法在控制器,因为它们是从 ajax 调用中请求的,但这不是嵌套的,依此类推。我担心这太混乱了,不笼统。

我还好吗?我是不是搞混了?我不想弄乱我的同事们的理解。理论在应用时变得棘手..

【问题讨论】:

    标签: php laravel rest design-patterns model-view-controller


    【解决方案1】:

    我要试试这个。我自己也在学习这方面的知识,所以如果有任何错误的信息,请纠正我。

    在可扩展性方面,您应该始终能够独立创建任何模型,即使此时它似乎并不是绝对必要的。 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>Factoryfactory implementation,它负责弄清楚如何将发布的数据映射到不同的模型,并且如何指定它们的关系。在底层,这个工厂只是使用模型类的创建工具将您带到您想去的地方。

    当您在模型中自动执行此过程时,将无法独立创建资源。

    当您改为在任何不符合 REST 范例的单一资源控制器中自动执行此过程时。

    使用工厂模式,您可以显式使用该类来执行更高级别的操作,上述问题均不适用,更不用说这种方法是否符合 REST。

    关键的一点是,通过对单一资源端点执行多个请求,必须仍然可以实现完全相同的结果,并且为了方便起见,您的额外 /api/sensible-name 端点只是替代了调用这些多个端点的需要,当您确实想一次性创建多个记录时。

    请注意,我的陈述与创建哪些端点来获取嵌套资源无关。 This SO question 就什么是可以接受的,以及您的具体需求可能如何与之相关进行了一些很好的对话。

    归根结底,一切都取决于对您和您的应用程序有效的方法,而 REST 等只是向您提出尽可能满足一般 Web 开发中类似需求的方法的理念。

    【讨论】:

    • 谢谢。我更喜欢这种工厂方法,因为它允许独立创建资源,并且由于视图要求,代码不会绑定到某个地方。需要明确的是:每个模型都应该有自己的创建工具,工厂可以访问,并且只关心他们的桌子。他们的控制器为此方法提供访问点。工厂可以访问多个模型方法,并作为单一操作的“组合资源”。那样可以么?非常感谢您抽出宝贵时间 Jeffrey。
    • 是的,这是正确的。无论您是否提供实际的端点来对资源执行操作,可扩展的应用程序都支持从 DB 到 HTTP 层随时实现此类端点。创建路由和控制器然后即插即用。祝你好运,不客气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2021-09-02
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多