在php驱动的web应用程序中使用mvc设计模式

在php驱动的web应用程序中使用mvc设计模式,php,oop,model-view-controller,Php,Oop,Model View Controller,最近我一直在阅读有关stackoverflow上mvc的教程和问题,我需要问几个问题,看看我是否正确理解基本概念 据我所知,在大多数情况下,只有一个视图对象用于呈现多个视图(html文件)就足够了。这是正确的吗 为了避免给视图层增加额外的复杂性,将表示逻辑放在视图文件中是否比放在视图对象中更好 众所周知,拥有一个索引页并根据请求URL和文件名从中自动加载控制器是一种良好的做法。但是,这不意味着每个请求url都有控制器吗?可以将一些请求URL分组并将它们映射到一个控制器吗。(在索引页上有多个if

最近我一直在阅读有关stackoverflow上mvc的教程和问题,我需要问几个问题,看看我是否正确理解基本概念

  • 据我所知,在大多数情况下,只有一个视图对象用于呈现多个视图(html文件)就足够了。这是正确的吗
  • 为了避免给视图层增加额外的复杂性,将表示逻辑放在视图文件中是否比放在视图对象中更好
  • 众所周知,拥有一个索引页并根据请求URL和文件名从中自动加载控制器是一种良好的做法。但是,这不意味着每个请求url都有控制器吗?可以将一些请求URL分组并将它们映射到一个控制器吗。(在索引页上有多个if-else语句或将信息放入数组配置文件中)
  • 如果我有一个视图对象,则与该对象和控制器的关系必须为1:1。这是真的吗
  • 最后,如果我需要将大量信息从控制器传递到视图,其中一些信息会在其他控制器中重复;然后,它是处理其他控制器的父控制器中的重复信息的好方法吗

如你所见,我仍然很困惑。提前谢谢。

好吧。。。这是一个有趣的问题。。。一般来说,MVC的设计目的是将这3个通常相互缠绕的组件解耦

如果您的模型不能同时支持多个视图,则它不是MVC

如果您的模型与控制器对话,或者甚至知道它的存在(这也适用于视图),那么它就不是MVC

如果视图和控制器之间的比例为1:1,则很可能不是MVC。 您应该能够从系统中调出这3个组件中的任何一个,主要只需更改配置即可


这是一个极为误用的术语,在MVC上的“尝试”常常以极为耦合的代码结束,而MVC的概念就是为了解决这个问题而设计的

用PHP实现MVC的方法不止一种

一个类支持一切(全局控制器)。 它加载你的类,它处理URI以知道哪个控制器启动,它检查你的数据(GET,POST),它检查用户会话(是否过期?是否有人登录?他是管理员?)

许多支持交互的类(控制器)。 一个类管理你的新闻,一个类管理你的用户,等等。。。 使用静态方法,让每个用户对动作进行建模。 基本上是“添加新项目”、“删除项目”、“更新项目”

许多课程讲述事物是如何组织的(模型)。 您的用户具有登录名、哈希密码、电子邮件地址等。。。 有关更多信息,请参见DAO。(基本上,所有SQL都在这些类中)。这些类只检查给定的数据是否符合预期

许多课程讲述如何显示事物(视图)。 由提供所需内容(对象、数组、输出数据)的控制器调用 只有一个地方有HTML,而且更复杂的地方是创建整个HTML的循环中的一个循环。 一个显示“居中框中的消息”,一个显示“元素列表”,一个显示“单个元素”,一个显示“单个元素,带有作者侧栏”,等等


HTML模板/元素对构建视图很有用,但视图调用模板/元素并按视图所需的方式放置它们。

当说“视图”时,您指的是HTML模板文件还是呈现这些文件的对象?@Whiteley这取决于应用程序的设计。目前,我正在编写相当多的代码,其中PHP用于控制器和模型(因此PHP为数据请求提供JSON响应,PHP代码用于获取创建、更新和删除操作的参数),而应用程序的其余部分(恰好是视图)都是用纯静态HTML和javascript编写的。(使html成为视图)在这种情况下,如果整个应用程序从php更改为java servlet,那么视图将不需要任何代码更改。当我说控制器和视图之间的1:1关系时,我指的是视图呈现器。对不起,我是技术性的而不是概念性的。否则,我知道我的登录控制器需要10个以上的视图。