大约6个月来,我一直在尝试研究MVC模式,我阅读了大量关于MVC和HMVC模式的文章、问答和博客文章,但我只是不完全理解它。
我尝试通过使用广泛使用的PHP框架之一CodeIgniter来学习MVC。我用它为我的公司实现了很少的内部网站。尽管如此,我还是不能百分之百地理解。我认为最好的学习方法之一就是严格遵守规定的规则。
因此,我的问题是:在MVC模式如何实现方面,最严格的PHP框架是什么?它定义了我如何使用模型、控制器和视图,这样我就可以完全获得MVC是什么?
发布于 2013-04-17 14:09:08
没有这回事。
框架不实现MVC或MVC启发的设计模式。你的申请。
MVC并不是某种神奇的调料,您可以通过将它转储到框架中来添加到应用程序中。相反,您实际上需要学习和理解上述模式(以及相应的原则和实践,如实心、LoD、SoC)。只有这样,您才能尝试在您选择的框架内使用它。
如果一个框架宣称它“有MVC",那么它是完全没有意义的。在这种情况下,它被用来将框架“出售”给那些更关心最新的炒作而不是应用程序设计和编码实践的noobs。
框架的目标是为您提供工具集合,当作为整体使用时,将为您提供一个经过修改/改进的开发环境。它们处理诸如路由、自动加载、存储的低级抽象(不,我不是在讨论活动记录反模式)和其他让您在boh开发和维护方面节省时间的事情。
总结
PHP中没有MVC框架。所有对我这样说的人实际上都是最糟糕的。即-码点火器、cakephp和yii。不惜一切代价避免他们(除非你的薪水真的很高)。
如果需要使用框架,当前最好的选择是Symfony 2.x、ZendFramework2.x或Laravel4.x的最新版本。这些应用程序不会为您实现MVC,而是会对您自己的应用程序体系结构造成最小的伤害。
发布于 2013-04-17 22:36:11
我只能和Cake交谈,而且在MVC方面我没有什么好说的。他们没有正确地执行MVC。Codeigniter在很大程度上是相同的。即使在使用了一段时间之后,您也没有“得到”MVC,这一点也不奇怪。
MVC仅仅是正确地分离应用程序逻辑的三个不同的组件:应用程序的核心、演示以及使两者在现实世界中工作所需的粘合剂。
你的应用程序的核心,包括所有的业务逻辑,数据库交互,服务,蜂鸣声和使你的应用程序成为你的应用程序的模式。模型不是一个特定的东西在一个特定的形状,它是任何必要的使你的应用程序的工作方式。你只有一个“模型”,那就是你的应用程序。
视图用于以某种方式输出模型所做的事情。这是用户界面。它是一切必要的显示有用的信息给用户。这可能是一个网站,它可能是一个命令行界面,它可能是一个本地桌面GUI。你可以在你的应用程序中使用这三者。
Controller只是用来使其工作的任何东西,主要是接收用户输入并将其引导到适当位置的东西。对于不同类型的上下文,您可能有几种不同类型的控制器,例如,一个可以处理传入HTTP请求的控制器、一个处理命令行输入的控制器和一个连接到GUI事件的控制器。
这些部件的具体形状完全取决于您的应用程序。这三者都可以算是他们自己的迷你应用程序。任何模板-预置框架“模型”都是为一种通用的情况而建立的,以帮助您快速地获取和运行一些东西;它通常不是您的模型应该采取的最佳形式。您将不得不为您的应用程序提出自己的结构,任何最适合它的构建。查看OOP原则、实体、依赖注入等,并根据这些准则构建您的核心模型。然后根据需要将视图和控制器围绕在它周围。
这种分离的目的只是为了使应用程序可维护和可扩展。模型不包含任何特定于任何特定形式的输入或输出的内容。例如,它不包含任何特定于格式的文本(比如HTML格式中的错误消息).它不采用任何特定形式的输入(如HTTP请求)。相反,视图不包含任何业务逻辑,它的任务只是输出。控制器也不包含任何业务逻辑,它的工作只是“输入”。原因很简单,控制器和视图都是可互换的,但您的应用程序不是。
如果您想为此使用一个框架,请使用一个模块化的框架,并允许您做任何您需要做的事情。Zend、Symfony、Laravel和类似的基于挑选的组件框架最适合这一点。
发布于 2013-04-17 23:49:25
这种框架不可能存在,原因有几个。
首先,MVC模式中的模型是使应用程序成为应用程序的一部分。如果一个框架要严格定义模型的样子,那么该框架只能用于一个或最多几个应用程序。这实际上阻止了它成为一个框架。
第二个问题是,对于MVC模式的适当应用是什么样子,还没有一个普遍的共识。例如,有些人会说,Controller必须向View提供它从模型中需要的数据,而另一些人则会说,View应该自己检索它需要的信息,而Controller应该确保View知道在哪里找到模型。
另一个更特定于web应用程序的例子是View可以完成的处理量。对于一些人来说,视图应该完全由HTML文件组成,其中一些地方持有者可以用实际的内容替换(通常由Controller从模型中检索),而另一些人则非常习惯于让View进行与UI相关的处理,比如将所呈现的内容国际化。
https://softwareengineering.stackexchange.com/questions/195297
复制相似问题