MVC + 服务层在 zend 或 PHP 中很常见吗?
Posted
技术标签:
【中文标题】MVC + 服务层在 zend 或 PHP 中很常见吗?【英文标题】:Is MVC + Service Layer common in zend or PHP? 【发布时间】:2011-04-14 06:00:58 【问题描述】:您可能听说过 Fat Model/Thin Controller 与 Thin Model/Fat Controller 的区别。我最近听说你可以在模型中的一些逻辑进入服务层之间做一些事情。这有多普遍?你知道(或能想到)任何能说明这一点的真实例子吗?
【问题讨论】:
HMVC ?分层模型视图控制器? @WalterJ89 啊哈,感谢您的任期。顺便问一下,你知道是谁想出来的吗? 我不确定是谁提出来的。我只是从 Kohanaphp 的文档中记得它。 kohanaframework.org我熟悉 MVC,但 H 部分仍在我的学习列表中。 【参考方案1】:Martin Fowler 描述了他的伟大著作Patterns of Enterprise Application Architecture 中的Service Layer 模式。如果您关心您提出的问题,您应该阅读这本书。
我想到的一个用途是管理数据库事务。有些人试图在他们的领域模型中封装启动和提交事务。但是当域模型调用其他域模型也尝试启动和提交数据库事务时,他们会感到困惑。那么哪个模型真正可以决定事务是提交还是回滚?如果不同的客户以不同的方式使用给定的模型,你会怎么做?
服务层是一个解决方案,因为这是您可以开始和提交涉及多个领域模型的工作的层。
至于这有多普遍,我觉得根本不普遍。大多数使用 Zend 框架(或任何其他 PHP 或 Ruby 框架)的人刚刚从“Active Record 解决一切”转变为新的闪亮的“Data Mapper 解决一切”。似乎这个社区每五年只学习一种新模式。他们暂时不会到达服务层。
来自@ktutnik 的回复:
不,服务层模式与存储库模式不同。 Repository 是关于抽象数据库访问,因此您可以使用像 Collection 这样的数据库。服务层是关于封装复杂的应用程序操作。
考虑它们的另一种方式是它们与域模型的关系。存储库用于域模型和数据库之间。而服务层使用一个或多个领域模型。
Service Layer ---> Domain Model(s) ---> Repository ---> DBAL
【讨论】:
另一件通常让我感到困惑的事情.. 服务层和存储库.. 是相同的还是不同的想法?谢谢【参考方案2】:Service layer 倡导相对较新,仍然受到各种解释的影响。我认为这意味着拥有一个利用控制器调用的多个域模型的层(尽管我可能过于简化它)。我最近利用这一点开发了一个网站,我遇到的实际优势是:
功能即服务有助于提高可扩展性。如果您的图像服务最初使用本地服务来完成它的工作,那么将该服务指向另一台服务器或某个第 3 方变得更容易,而无需进行全面更新
灵活性。在项目进行到一半时,我决定更改一个核心功能,并且能够轻松地做到这一点;让我快速权衡更新的利弊。这种灵活性在快速原型制作时很有用,并且可以灌输一定的信心,因为如果您需要重新审视某些东西,这不会是一场噩梦。
可扩展性。我已经在我的应用程序中确定了服务,我可以预见将来会向其他开发人员或其他小部件、移动应用程序开放。理论上这样做只是为服务添加身份验证和授权(因为功能已经在它自己的层中,我不必花时间尝试将我想要公开的内容与代码库的其余部分分离)。
服务很容易添加和删除(也许这属于前面的几点)。我有特定于项目特定阶段的服务(例如,仅邀请阶段),一旦该阶段结束,我就可以放弃这些服务。
我认为它具有实际优势,实施成功的关键是拥有管理应用程序中服务的好方法。我用的是symfony的dependency injection component
【讨论】:
Re #2,您能否举一个具体示例说明您是如何更改该功能(之前和之后)的,以便更容易理解服务层的实际工作方式?在#3 中,您听起来像是在谈论 API,而#4 听起来像是权限系统。我仍在尝试了解此服务层的含义以及使用它的正确方法,所以也许这就是我回归那些更知名的概念的原因。 2.我从使用 solr 切换到 mysql 并返回,对我的模型或控制器没有太大影响。 (事实上,在我尝试之前,我正在等待教义的 mongodb 实现的教义成熟一点,这就是为什么我提到它有助于建立信心。 3.我正在谈论将我的一些服务提供给第 3 方开发人员,甚至是我自己的移动应用程序或其他消费内容的方式。 4.我用一个例子来说明利用服务层可以很容易地添加或减少功能(可能与第 2 点相同)。但是我可以添加或减少服务而不会使整个应用程序失败。例如。我有一个邀请服务,我可以通过从配置中删除它来退出,应用程序将继续运行良好。【参考方案3】:查看 ZFEngine 它是 ZF 上的 cmf 与服务层实现
【讨论】:
以上是关于MVC + 服务层在 zend 或 PHP 中很常见吗?的主要内容,如果未能解决你的问题,请参考以下文章
Zend Framework / MVC:将啥类型的对象推送到视图?
警告:require_once(Zend / Application.php)[function.require-once]:无法打开流:没有这样的文件或目录