PHP MVC - 如何设计?

Posted

技术标签:

【中文标题】PHP MVC - 如何设计?【英文标题】:PHP MVC - How to design? 【发布时间】:2010-12-05 17:49:47 【问题描述】:

我比较精通网站设计。我主要选择 LAMP,我已经拥有自己的小型“框架”,我使用它。简而言之,它将逻辑与布局分开,我基本上有一个逻辑文件到一个或多个布局文件,具体取决于布局中支持的视图。有一个管理部分,有用户身份验证和所有这些东西。很好。

因此,当我希望在 php 中设计/编程或网站编程的方式更加详尽时,我想知道如何正确地“思考”MVC。我倾向于这种方式,因为我当前的框架非常面向 DB,并且在性能至关重要的地方变得有些沉重。

所以这是我的问题:我是否正确假设控制器通常对应于“部分”或“页面”并且视图负责显示该控制器,并且模型处理控制器使用并显示在视图中的对象?

举个例子(不是太详细,但足以看看我的想法是否有效):

假设我们有一个简单的游戏网站。 这些部分通常类似于:首页、游戏、论坛以及关于/免责声明等。

控制器类对应于部分,但更详细地涵盖了该部分所涵盖对象的“单实例”版本,即游戏部分变成了两个控制器;一个用于游戏概述(游戏列表),另一个用于游戏页面本身。整体将类似于 首页、游戏概述、游戏页面、论坛、论坛、主题页面、关于和免责声明

视图可以是每个控制器的多个布局,例如与控制器相同,但可能是论坛页面(取决于您希望如何查看它们)和游戏页面(可能是高分视图)上的各种视图等等。

模型(或数据对象) 通常是用户、游戏、论坛、主题、帖子,然后是许多帮助对象,如主题标签、游戏高分以及不让主题成为可能的对象分类和能够获得高分的游戏等。

上述“正确”的思维方式是不是我完全误解了网站的整个 M-V-C 概念。

我正在考虑改用 CodeIgniter 或其他一些轻量级框架(请随意评论框架选择,或者我自己的框架是否更好),因为我自己的框架非常面向 DB 并且没有削减它现在我的几个网站每天的浏览量都超过了 70,000。

真诚地感谢那些可以帮助回答我对 MVC 的看法是否正确的人,如果可能的话,添加一些提示,说明在编写 MVC 时要考虑什么,并且仍然希望保持领先性能(尽可能使用脚本语言)。

【问题讨论】:

为什么不使用zend? 赞德?轻的?高性能?我不这么认为。问题实际上不在于什么框架,而在于我是否正确地考虑了 Web 环境中的 MVC。不过还是谢谢。 如果服务器配置正确,你可以用 Zend 实现一个高性能的网站没有问题,但我必须说,开箱即用的东西可能确实会影响性能。 在谈到性能时,尽量使用 PHP 5,它更好地平衡并在面向 OOP 的代码中表现更好 我同意 php5 的论点,这将是反对使用 CI 的另一个论点。 【参考方案1】:

CodeIgniter 是 MVC 初学者的绝佳工具, 我建议你看看net.tutsplus.com CodeIgniter 有一个正在进行的视频教程

添加

对于想要深入 CI 的初学者,视频教程的链接:

CI day 1 CI day 2 CI day 3 - sending emails CI day 4 - newsletter signup CI day 5 - basic CRUD CI day 6 - login CI day 7 - pagination

添加

我不推荐 CI 作为伟大而强大的框架,但它对初学者来说很简单,他们可以从中学到很多东西,我个人赞成 Symfony 和 Yii

【讨论】:

我不推荐 CI,它是一个限制性很强的框架,它会在你的手上放置链以供高级使用,并且它面向 PHP 4,这对其有很大的限制。 我知道,但它为 MVC 框架的初学者简化了结构。经过如此简单和有限的 fw,程序员可以转向更高级的东西,如 Symfony 或 Yii 同意,这是一个很好的观点。如果他们以后不使用 CI,我只是不建议任何人在 CI 上投入时间。阅读 Symfony 或 Zend 框架将做同样的工作来解释 MVC 结构加上投入的时间可能会得到回报,因为您将实际使用这些框架。 你是对的,但正如你所说,掌握 mvc 模式不仅仅是关于 web 应用程序。所以在其他地方学习它(smalltalk,自定义实现),然后将它应用到 web 框架。我什至认为,接触 mvc 框架的最好方法是研究它们的源代码,然后尝试自己开发更好的框架..【参考方案2】:

首先,这不是一个特定于 php 的问题,而是一个关于如何将 MVC 模式应用于 Web 编程的问题。确实,MVC 模式在 Web 应用程序开发领域非常有意义,以至于它几乎已成为该应用程序领域的当务之急。

现在,至于 MVC 模式本身,您已经在 SO 上找到了非常好的答案。例如What goes into the controller 的问答。

关于如何将您的网站结构映射到您的控制器架构的问题,我建议如下。

不要尝试映射您的导航,而是要映射应用程序逻辑 每个逻辑功能单元一个控制器 在控制器内部,每个视图都有一个公共方法 相当精简的控制器,主要在模型和视图之间扮演网关

因此,例如,如果在您的情况下 gameoverview 只是一个列表,它不需要自己的控制器,而只是 indexcontroller 中的一个方法,它从模型中获取列表并将其发送到相应的视图。但是,如果您的游戏概览是一个具有多种可能性和不同子视图等的复杂机制,您可以拥有一个带有多种方法的概览控制器,用于不同的视图和任务。

我真的建议研究 Zend Framework 以及如何解决这些问题。 IMO 你可以通过这样做真正了解你的问题的主题。

【讨论】:

不错的答案,我正在使用 CodeIgniter。 Zend Framework 是否比 CI 更好——考虑性能?您能否根据您的经验建议我使用正确的框架?谢谢:)【参考方案3】:

***可能更好地解释这一点,但基本上,

您的模型代表和抽象您的基础数据(例如,提供抽象层,因此其他元素不必与数据库交互......甚至知道它在那里)。

您的控制器处理更改模型的请求。

您的视图是部分模型的显示和来自控制器的反馈。

控制器和模型都不应该处理显示。展示。 模型和视图都不应该处理传入的 POST 数据等。 控制器和视图都不应该处理数据源。

请参阅http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller#Description 了解角色的详细说明。

您在问题中描述的内容不符合此描述。例如,每个模型类(或更少)应该有一个控制器来处理对这些模型类所代表的元素的请求。

您的视图不应明确地绑定到任何一个控制器或模型元素。视图代表整个模型的一个子集。

视图和控制器之间的唯一交互是反馈的显示。

希望对您有所帮助。

编辑: 正如其他人指出的那样,已经构建了许多 MVC 框架。 (有关列表,请参阅 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller#PHP),如果有另一个可以更好地完成工作,我建议不要过于依赖您已经构建的框架。

【讨论】:

以上是关于PHP MVC - 如何设计?的主要内容,如果未能解决你的问题,请参考以下文章

用纯 C 实现的 MVC

从后端角度看 php 中的 Flux 架构

什么是MVC设计模式,如何使用MVC

简述MVC思想 与PHP如何实现MVC

如何将基于页面的 PHP 应用程序转换为 MVC?

四种设计模式如何融入 MVC 范式?