如何在 MVC/Symfony 项目中实现 Restful Objects 规范


How to implement Restful Objects specification in MVC/Symfony project

我一直在浏览 http://restfulobjects.org 上可用的RESTful规范(直接链接到这里的规范)。它与我见过的其他东西有点不同,但它是有道理的,并且有示例和清晰的规范使我的开发变得简单得多。

根据标准,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

有关结构的简要说明,请参阅此答案。这是很清楚的。

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

我的项目仍在绘图板上,大多数设计元素都可以掌握。但是,我将使用Symfony。我有我的实体,我有一些作用于这些实体的服务,我有控制器来定义服务在特定上下文中将执行的操作。

所以对于我的实际问题:

。Restful Objects规范不是基于MVC模式 - 它使 对实现的服务器的体系结构没有假设 接口。在网址中:

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

"actions/lastOrder"没有指定控制器操作,它是 指定对域对象的操作(即方法)(客户/31)

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

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

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

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

摘自 Fabien Potencier 的"什么是 Symfony2?"一文:

Symfony2是一个MVC框架吗?

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

在这篇文章的后面:

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

由于Symfony是一组组件,你可以很容易地根据你正在处理的项目以及你想要遵循的原则来调整框架的使用(这里是REST规范)。

FOSRestBundle 非常可扩展.
您可以手动定义路由,通过序列化创建对象的不同视图。

另外,我认为您可以通过在存储库类中编写大部分对象管理的逻辑来保持非常轻巧的控制器。

所以

  • 使用简化的模型和序列化来获得对象的不同视图/层。

  • 不应该为了更多的REST而重新考虑你的整个实体/服务,只是给它们一些更改/改进,以便通过数据传输对象/域对象(模型)和存储库类(获取/存储方法)使用它们。

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

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