0

我正在使用 PHP MVC 框架(Yii,但我的问题可能适用于大多数 MVC 框架)来创建一个应该包含 Web 应用程序(网站)和 RESTful Web 服务的项目。我正面临如何在逻辑上分离应用程序和服务逻辑的早期设计决策。以下是一些真实的事实:

  • Web 应用程序和 Web 服务将共享许多功能,并且仅在呈现格式(View与 JSON)上有所不同...
  • ...但是,Web 应用程序和 Web 服务将具有一些独特的功能(即,Web 应用程序会做一些服务不会做的事情,反之亦然)

以下是我的愿望:

  • 我想尽可能地分享通用功能的实现
  • 我不希望Controller由于结合了 Web 服务/Web 应用程序逻辑而变得笨拙
  • 我对创建单独的 Web 服务和 Web 应用程序控制器有点Action反感,尤其是当它们在s 中重叠时(除了呈现的格式)
  • 除非确实是必要的设计决策,否则我不希望网站使用 Web 服务;我将失去许多使用数据库接口的内置功能和/或必须IDataSource通过将其连接到 Web 服务来创建符合可用和其他此类接口的类;也可能会有轻微的性能下降。

我考虑了一下,并在下面提出了一些解决方案。请让我知道您认为哪些可以满足我的需求,或者如果我的需求不合理/适得其反,请告诉我。

  1. WebApp为和实现完全独立的控制器WebService(将两者模块化,使它们不共享代码)
  2. WebApp为and实现单独的控制器WebService,但创建完成繁重工作的方法并调用这些方法来共享实现 - 例如,如果我想做 aitem/findBySomeCrazyCriteria我会根据 URL 路由到适当的控制器,但每个控制器都会引用一些FindItemsBySomeCrazyCriteriaFunction()定义的别处。
  3. 让 Web 应用程序使用 Web 服务(这需要我扩展服务的计划功能)
  4. 为两者实现一个控制器WebAppWebService,它从一个BaseController包含用于REST类型东西的通用钩子的扩展,并在必要时使用覆盖
  5. 还要别的吗

虽然我的问题与 Yii 有关,但我觉得这在过去对许多开发人员来说一定是有过的。我想知道你做了什么/你建议继续前进。我担心如果我选择了错误的方法,我会“破坏 MVC”或者以后会后悔。

4

2 回答 2

1

注意:您不必担心“破坏 MVC”。既然你选择了使用 Yii,那部分已经发生了。

问题的根源在于您的控制器做了很多事情(因此违反了SRP)。您所谓的“控制器”实际上还包含应用程序逻辑(应该是模型层的一部分)和 UI 逻辑(通常是视图实例的一部分)。

您应该拥有一个应用程序,具有一个模型层和两个表示(您称为“Web 应用程序”和“Web 服务”)。控制器应该是可能的。

您应该将应用程序逻辑移动到服务层,然后表示层将通过该服务层与模型进行交互。你最终会得到一个更轻的控制器。然后,您可以为您的项目需要的每个演示文稿提供一组单独的控制器/视图,而无需重复或少量重复代码。

于 2013-01-07T06:28:39.627 回答
0

我建议不要编写多个控制器。将域逻辑保留在模型中而不是控制器中是一个更好的选择。您的控制器应仅充当逻辑的网关,并以客户端请求的任何形式为它们提供服务,例如。作为 JSON 编码的响应或通过视图。最好只保留识别客户需求的任务,并在从模型中获得结果后以适当的形式翻译响应。

这个流程可以通过合适的助手和一个良好实现的路由子系统来简化,这样客户需求的检测就变得不费力了。

例如。/user/subscriptions.html将获取一个 html 页面,/user/subscriptions.json并将获取一个 JSON 响应。

于 2013-01-07T04:35:11.090 回答