在阅读有关MVC框架的在线讨论时,我听到很多评论指向来自Java / .NET开发人员的像Cake,Code Igniter和Symfony这样的PHP项目,其中包括“那些是聪明的黑客,但不是真正的MVC”。 。

那么,是什么让某事成为“真实”的呢? MVC框架;即什么是.NET或Java MVC框架的例子,它做的事情与Cake,Code Igniter,Symfony等不同,那些不同的东西是什么?只是PHP缺乏强制对象导向需要引导程序,还是其他东西?

我知道为什么PHP语言“糟透了”,我对MVC实现和/或使用的差异更感兴趣。

有帮助吗?

解决方案

MVC的想法是将应用程序体系结构分解为三个独立的层,并允许这些层中的每一层使用不同的实现而不影响其他层。主要区别在于业务逻辑(模型)和表示(视图)。

许多PHP框架试图使用“固定软件”的Ruby on Rails哲学。因此,Model和View的正确运行要求两者都符合某种实现。也就是说,类必须以某种方式命名,项目中的文件必须根据某个目录结构进行组织,View脚本中的符号必须遵循约定等。

这使得很难独立地替换每个层的不同实现,这违背了MVC将层彼此分离的目标。

其他提示

您可能会发现维基页面非常有用。

真正的MVC框架没有M(odel)层。 CakePHP和朋友有一些聪明的类来访问数据库,他们称之为Model,将大量数据处理留给Controller。

那是错的。模型应该完成所有数据处理(并且可以使用帮助数据库类),Controller应该是用户/网页和模型之间的网关。大多数情况下,模型是一个不遵守任何规则的简单PHP对象,因此框架无法指定这些规则。

以下几个问题可以帮助您了解您的框架是否良好和真实。

“我可以在没有框架的情况下为我的MVC类运行单元测试吗?”

即使您没有编写单元测试,这也适用。

您应该能够独立于框架编写与MVC相关的代码。当您的应用程序从框架中收到一些输入时,它应该是作为具有已知接口的对象,没有具体的类。

事情是, MVC框架对架构本身没有(或非常有限)的影响。充其量,它只是为应用程序调用提供清晰简单方式来访问您的MVC三元组。并且可能为提供便利,而不是限制和约束。

“它是在魔法和仙尘上运行吗?”

您应该能够扩展框架提供的任何类。并且应该很容易理解你必须实现哪个功能。

如果“事情刚刚发生”,这就很难做到。这通常指向框架代码中的全局状态。无论是静态方法还是全局/静态变量。

“我的代码何时启动?”

您能找到控制器执行的位置和方式吗?通常它不会那么容易。这个神秘点通常在对象图中很深。有时甚至在扩展课堂上。

这种情况使您很难更改执行控制器的环境。它还对控制器方法的外观施加了严格的规定。

这一切都回到了这一点,即真正的MVC框架应该增强开发过程,而不是限制你的选择。

“他/她应该能够这样做吗?”

身份验证授权似乎是开发的一个独立方面,但实际上,在MVC的上下文中,它有一种有点棘手的倾向。

许多框架都有一些身份验证/授权基础架构。这是一个重复性的任务,我们都已经完成了它,因此 - 它是功能的一个很好的候选者,框架可以提供。

但是这里是踢球者:他们中的大多数都试图将授权放在你的控制器中,他们对如何调整它非常挑剔。这是另一个限制。

归结为这是什么。对于任何框架,一定不需要重写每个控制器只是为了添加登录功能。即使你忽略了违反OCP的行为,这也会增加你不小心忘记某些事情的风险。

..我的两分钱

蛋糕和大多数“MVC”框架是你可以称之为“被动视图”的框架。 MVC。 这是一篇很棒的文章解释: http://www.martinfowler.com/eaaDev/PassiveScreen.html

有时人们需要退后一步,看看现实生活中的“框架”。数字世界从中得到了这个术语。这可能有助于解释它的意义,尽管无数的在线选项扭曲了这个词以适应个人议程并贬低其他系统。

框架应该可以帮助您完成工作的每个方面。

因此,如果您只有一个投资组合页面 - 那么您只需要一小组工具。如果你开始下一个Facebook,那么你的“框架”就可以了。会有很大的不同。

正如其名称所暗示的那样,框架旨在支持结构 - 在本例中是您的应用程序。关于你看到的大多数框架的常见(和令人悲伤)的事情是,它们本身就变成了强大的结构,决定了它们自己分离业务逻辑,表示,路由/控制的方式。您会看到应用程序代码,看起来您需要整个团队来维护一年前写的内容。似乎目标是框架中的功能丰富。不,这不对。这是为了让程序员自由决定应用程序的哪些组件应该分开以及应该分离的位置 - 只要任务可以在具有自己专业知识的个人工作组中进行分配。 / p>

分离是否应该在模型,视图和控制之间进行 - 顺便说一下必须以某种方式相互沟通 - 模糊或区别应由解决方案架构师决定。

JavaServer Faces是一个非常好的MVC完整堆栈框架。它具有良好的View组件,具有托管bean的良好控制器,对于模型,您可以创建业务类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top