【问题标题】:MVC in PHP – General understanding and specific questionsPHP 中的 MVC – 一般理解和具体问题
【发布时间】:2014-06-28 01:46:05
【问题描述】:

我目前正在尝试了解 MVC 框架在 PHP 中是如何工作的。因此,我创建了这个我如何think 的基本草图,即 MVC 是在 PHP 中实现的:

[我知道缺少一些步骤,例如Router如何解析 route 以了解要加载的 ViewController,但这些步骤是基于技术的,对于理解 PHP 中 MVC 的一般流程并不重要。 em>]

我从article series 中得出我对 PHP 中的 MVC 的理解。但是,我认为这种结构与人们在谈论 PHP 中的 MVC 时所想到的大多数结构不同,因为这个article(文章基本上指出不仅Controller,还有View确实与Model 通信)。

我现在想问你几个问题:

  1. 这通常是一种right在PHP中实现MVC的方式吗?
  2. 如何向此方法添加登录/注销系统?这样登录的用户将始终看到 LoginView,而 登录的用户可以看到不同的视图? (我知道登录系统是如何工作的,但我不知道将其放置在 MVC 中的何处,因此我不必多次插入代码,例如在每个控制器中。 )
  3. 如果我的应用程序包含多个始终加载的元素(比如用户栏 [带有用户名、设置链接等]、导航和内容容器),该怎么办?如何将这些元素组合成最终视图? (我想到的唯一想法是在每个视图中分别组装最终视图,但这意味着我必须在每个视图中多次插入代码,这没有抓住重点MVC,不是吗?)
  4. 如果我想在我的应用程序中使用 AJAX 怎么办?我的想法是通过框架发送 ajax 请求,同时只访问为 ajax 制作的控制器和视图?换句话说,AjaxViews 只返回例如json objectsAjaxControllers 总是希望验证码证明这些 ajax 调用是合法的?

我知道已经有人问了很多关于 PHP 中的 MVC 的问题,我一直在安静地阅读很多文章,但我认为只有阅读不会让我完全理解MVC

此外,在阅读了上面链接的文章之后,我不再确定我在网上找到的其他关于 MVC 的文章是否确实与上面的文章以相同的方式解释了 MVC。因为如果他们不这样做,我会在阅读两种多种不同的方法时尝试理解一个框架。

非常感谢您花时间回答我的问题!

--- --- --- 更新 --- --- --

根据下面的答案,我更改了 MVC 草图。以防万一有人发现此链接并想了解更多信息。

【问题讨论】:

  • 您所描述的不是 MVC,而是各种 Rails 克隆。这是一个骗子。有大量 StackOverflow 帖子的用户认为他们了解了 MVC 是什么,但被声称 MVC 但甚至不是远程的流行框架的不良营销所欺骗。一方面,模型不是数据库的持久层,控制器不应该在模型和视图之间进行调解(也不应该传递数据)。视图应该对模型的变化做出反应。 stackoverflow.com/questions/18048960/…
  • @RonniSkansing - 我想我没有提到流行框架的任何营销,是吗?请告诉我。此外,我认为我的控制器没有在模型和视图之间进行调解,也没有将数据从模型传递到视图。你是从我的草图中解释的吗?比我的草图可能不精确,我需要改进它。正如我所说的 PHP 中的 MVC 没有观察者结构,因为当一个动作被触发时整个应用程序被重新加载(例外:AJAX),所以这就是为什么视图不需要对模型的变化做出反应,是吗? ?
  • 完全正确,您没有提到任何框架。你的画也很好,一开始就被误读了。在我看来,php 和服务器端语言中确实没有 MVC,有些人称它为 web mvc,但实际上它们是 rails 克隆。试图将整个过程粘在字母 mvc 中确实不适合在浏览器中单击某些内容、使其发送请求、处理请求、在无状态 http 后刷新视图等完整过程。
  • Front Controller 也可以是它自己的模式,所以我不会将它放入 MVC 草图中,而不会使其与众不同:en.wikipedia.org/wiki/Front_Controller_pattern

标签: php model-view-controller


【解决方案1】:

让我先回答你的问题,然后发表我的看法。

  1. 没有正确的方式来编写 MVC。有如此多的风格和变化,当谈到 web MVC 时,它们甚至会成倍增加。
  2. 关于登录和注销。我认为最强大的系统是基于角色的访问控制与访问控制列表相结合,请参阅How can I implement an Access Control List in my Web MVC application?
  3. 一般有两种方法,或者你的Controllers和Views的比例是1:1,然后在Controller完成后,你的bootstrap脚本调用同名的View(LoginController,LoginView),或者你的Controller返回视图名称以及操作和参数,由引导程序调用。然后视图选择一个模板,该模板可以包含其他子模板(如用户栏或页脚)。
  4. 在这种情况下,您的视图需要能够根据Accept: HTTP 标头选择不同的模板(并在您的 AJAX 请求中发送类似Accept: application/json 的内容)。然后,您的视图将返回 JSON 模板而不是 HTML 模板。

你的草图有什么问题?

您的模型不仅仅是通往数据库的网关,它是所有逻辑发生的地方。所有的计算。请参阅另一个解释 How should a model be structured in MVC? 的出色答案。

MVC 的理念是将您的应用程序简单地分成三层:输入(控制器)、逻辑(模型)和输出(视图)。这是对 PHP 工作方式的扩展(这是一个请求,给我一个响应,都在同一个页面中)。

因此,实现细节可能会有所不同,重要的是概念。 “Web MVC”只是良好的 OOP 实践和几十年前某人制定的一些命名约定的结果。

【讨论】:

    【解决方案2】:

    用于并行开发和代码重用能力。您的系统如何工作和用户如何工作是分开的。这提供了该问题的解决方案。现在有边界了,MVC。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2011-09-15
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2021-01-17
      相关资源
      最近更新 更多