【问题标题】:How to implement Restful Objects specification in MVC/Symfony project如何在 MVC/Symfony 项目中实现 Restful Objects 规范
【发布时间】:2016-07-06 04:53:39
【问题描述】:

我一直在查看http://restfulobjects.org 上提供的 RESTful 规范(直接链接到规范 here)。它与我见过的其他东西有点不同,但它是有道理的,并且有示例和清晰的规范使我的开发变得更加简单。

根据标准,URI 将类似于:

  • api.example.com/object/user/31
  • api.example.com/object/user/31/properties/username
  • api.example.com/object/user/31/collections/channels
  • api.example.com/object/user/31/actions/someFunction
  • api.example.com/object/user/31/actions/someFunction/invoke

有关结构的简要说明,请参阅this answer。这很清楚。

注意:这不是讨论服务/操作是否可以 表示为资源。关于这个话题有一个很好的讨论 在这里:http://www.infoq.com/articles/Intro_Restful_Objects。查看 cmets 部分的末尾。

我的项目仍处于设计阶段,大部分设计元素尚待掌握。然而,我将使用 Symfony。我有我的实体,我有一些作用于这些实体的服务,我有控制器来定义服务在特定上下文中的作用。

我的实际问题也是如此:

...Restful Objects 规范不是基于 MVC 模式 - 它使 没有关于实现的服务器架构的假设 API。在网址中:

~/objects/customers/31/actions/lastOrder/invoke

'actions/lastOrder' 没有指定控制器动作,它是 在域对象 (customers/31) 上指定操作(即方法)

  1. 如果我想在 MVC 应用程序中使用规范,如何以最有效的方式构建控制器?考虑到控制器会以某种方式服务于不同的资源(对象、服务、域类型)以及该资源的不同表示。我的层是什么? 更新我有没有例如客户控制器?通用对象控制器?用户操作控制器?

  2. 我是否需要重新考虑我的整个实体/服务方法?即如何实现这一点的解决方案超出了控制器结构? (恐怕是这样,然后我不知道我的下一步)

  3. 为了简单/高效,我想使用 FOSRestBundle 和 NelmioAPiDocBundle。我相信这是可以做到的,但我担心该规范只会作为我的 url 模板,并没有在我的逻辑/设计中实现,因为我必须以某种方式调整我的框架以适应 URL。

如果这个问题有一个明显的答案,请原谅我的无知。我是 RESTful API 的新手。如果归结为对实现模型的主观看法,请给我一些指示,因为我目前不知道如何处理这个问题。

【问题讨论】:

    标签: php rest symfony model-view-controller


    【解决方案1】:

    您是否考虑过使用 Naked Objects(用于 .NET 平台)或 Apache Isis(用于 Java 平台)?这两者都免费为您提供了一个完整的符合 Restful Objects 的 Restful API - 完全源自您的实体模型。 (我负责这两个中的第一个。我们的实现是建立在 ASP.NET WebApi 框架之上的。我们有一个 RestfulObjectsController,上面有很多方法,但是这些都是泛型方法,对应于各种 Restful Objects 资源类型 - 我们不需要添加任何特定于域对象或其操作的新方法。

    【讨论】:

    • 那很诱人,但不幸的是我只有 php 经验,而且我不打算开始使用一种全新的语言。您能否提供更多详细信息,说明您如何布置控制器映射/路由到您的实体?我可能会在 php 中镜像类似的东西。
    【解决方案2】:

    来自the "What is Symfony2 ?" article of Fabien Potencier

    Symfony2 是 MVC 框架吗?

    环顾四周,每个框架似乎都实现了 MVC 模式。其中大多数都被宣传为 MVC 框架......但不是 Symfony2。看一下文档,你会发现 MVC 模式只被提及一两次,但 Symfony2 从未被定义为 MVC 框架。

    稍后在这篇文章中:

    Symfony2 是一个 HTTP 框架;它是一个请求/响应框架。
    这才是大事。 Symfony2 的基本原则以 HTTP 规范为中心。
    ...
    有时,您只需要一种方法来创建 REST API。有时,逻辑主要在浏览器中,而服务器仅用于提供数据(例如,想想backbone.js)。对于这些项目,您不需要 MVC 框架。您需要处理请求并返回响应的东西。您需要一个实现 HTTP 规范的框架。 HTTP 流是另一个不适合 MVC 模式的示例。
    ...
    如果你喜欢称 Symfony2 为 MVC 框架,那么你应该知道 Symfony2 真正是为控制器部分、视图部分提供工具,而不是模型部分。您可以手动创建模型或使用任何其他工具,例如 ORM。

    由于 Symfony 是一组组件,您可以轻松地将框架的使用适应您正在处理的项目以及您想要遵循的原则(这里是 REST 规范)。

    FOSRestBundle 具有很强的可扩展性。
    您可以define your routes manually,通过serialization为您的对象创建不同的视图。

    另外,我认为您可以通过在 Repository classes 中编写大部分对象管理逻辑来保持非常轻量级的控制器。

    所以,

    • 使用简化模型和serialization 拥有对象的不同视图/层。

    • 您应该重新考虑您的整个实体/服务以获得更多的 REST,只需对它们进行一些更改/改进,以便通过数据传输对象/域对象(模型)和存储库类(获取/存储方法)。

    • 您应该能够受益于使用 REST 实用程序(例如 FOSRestBundle),它提供的不仅仅是内置操作,还允许您制作您可能需要的所有自定义内容,无论是否为 MVC,以及是否为 REST。这是您自己的赞赏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多