【问题标题】:Is MVC now the only way to write PHP? [closed]MVC 现在是编写 PHP 的唯一方法吗? [关闭]
【发布时间】:2011-05-30 12:29:55
【问题描述】:

现在可用于 PHP 的大量框架都使用 MVC。甚至 ASP.net 也有自己的 MVC 模块。

我可以看到MVC的吸引力,我真的可以并且我经常使用它。我能看到的唯一缺点是您必须启动整个系统才能执行页面请求。根据您的任务,这可能有点浪费。

所以问题。在专业环境中,这是当今使用 PHP 的唯一方法,还是他们的其他设计方法具有其他优势?

【问题讨论】:

  • 对于Programmers Stack Exchange来说这是一个更好的问题
  • 肯定有其他/更好的方法来构建代码以分离关注点。至于商业环境,您可能仍需要将其标记为MVC
  • 简短回答:不,这不是唯一的方法(对于某些问题集,它不是迄今为止最好的方法)。
  • 如果您是解决方案的架构师,那么您就不必使用 MVC! MVC 一直是一种流行的方式,它可以将某种粗糙的面向对象模式强制到原本是过程代码的代码上。 MVC 具有分离语言(PHP、SQL 和 HTML/JS)和有时角色(后端编码器、前端设计师/开发人员)的优势。但除此之外,当涉及到 Web 应用程序时,它是一种相对随意、毫无意义的模式。它违背了面向对象编程的真正精神,它将应用程序组织成有意义的概念部分。

标签: php model-view-controller


【解决方案1】:

我不喜欢有人告诉我如何编写代码。如果我想使用 MVC,我会使用,如果我找到解决特定任务的更好方法,我会使用它。我不喜欢人们把 MVC 变成一种宗教。我还认为许多 php 编码人员误解了 MVC 概念并认为他们使用的是 MVC 模式,而实际上大多数时候并没有使用 100% 纯 MVC。事实是,编写一个 100% MVC 并用 php 编写的网站并不容易,也不是很高效。

大多数人在 MVC 的“V”部分遇到最大的困难。 “M”很简单。这是你的数据。如果您将数据存储在数据库中并具有数据库访问类,那就是您的“M”部分,您可以使用“M”

现在是控制器:当用户点击您页面的任何链接时,您的 php 代码必须从“M”(数据库)获取数据,准备它,应用一些逻辑,例如为登录用户添加个性化,添加“请登录”链接,如果用户没有登录,等等。这是你的“C”部分。

大多数人遇到的问题是将“V”视图与“C”(控制器)分开这并不容易,也不是在 php 中编码的最有效方法。在许多情况下,控制器部分必须已经生成了一些 html,因此您模糊了控制器和视图之间的界限。

如果您想保持纯 MVC,那么您必须确保您的控制器返回纯数据,然后 View 类采用一些模板,插入您的数据并返回 HTML。这就是问题出在php中的地方。没有简单有效的方法来进行模板化,其中模板仅将纯数据作为输入并返回 html。如果有一个简单的方法,那么人们就没有理由继续想出另一个新的模板库。有这么多 php 模板库的原因是因为总有程序员对现有的任何一个都不满意,并不断尝试发明自己的更好的模板。

在我看来,唯一的纯模板库是 XSLT,它完全由 php 支持,它带有 php,它可以工作,它功能强大,模板引擎很棒,更好的是,它是一种标准的、独立于平台的语言。一旦学习了 XSLT,您就可以在任何其他编程语言(如 Java)中使用它。但是,它确实有一个小问题。它要求输入是 XML。当然,您也可以使用也是 php 的一部分的 DOM 库在 php 中创建一个出色的、100% 有效的 XML。问题是它会很慢。您将做双倍的工作:首先从您的数据数组创建 XML,然后使用您的 XSL 模板将该 XML 转换为 HTML。这就是为什么 XSLT 作为模板引擎的方法从未在 php 中流行起来的原因。

现在您留下了解析模板的其他选项,通常是基于正则表达式的方法。你看到当我们到达 MVC 的“V”部分时它总是变得复杂吗?

“M”很简单,“C”是某种类型的纯 php 代码,无论是 OOP 还是过程代码,都无所谓。棘手的是“视图”。

所以我的建议是 - 不要太担心坚持纯 MVC。控制器在这里和那里吐出大块 html 是可以的。

【讨论】:

  • 很好的客观化。 - 一个术语附录:如果模型仅与数据库相同,那么它就是 Passive-MVC。 Model-Delegate 建议混合控制器和视图 - 但像 MVP 和 MVC 一样,actually meant for GUI 应用程序不适合 web 应用程序。
  • 将“V”与“C”分开也有助于让设计师负责“V”部分的团队,以及“C”部分的开发人员。
【解决方案2】:

还有很多其他的方法。

MVC 之所以受欢迎,是因为它适合大多数情况(或者说可以在大多数情况下使用),并且已经确立了自己作为事实上的标准。

可以说,每一种编程/设计模式——或更具体的架构——都依赖于某种分类。

这些通常是(当然可以进一步划分):

  • 用户界面(漂亮的图片、表格等)

  • 应用程序(您的应用程序逻辑和需要从客户端保护的东西 - 很多通常可以在用户界面中完成,例如通过 javascript)

  • 数据库 - 自我解释

  • 基础设施(非常基本的东西,如硬盘、服务器系统、网络等)

当然,总是有天真的、程序上直接的方法,但也有很多其他模式可以链接和构建对这些基本层的访问和控制。

Mvc 就是其中之一。但这里有一些其他的例子:

http://en.wikipedia.org/wiki/Model_View_ViewModel

http://en.wikipedia.org/wiki/Model_View_Presenter

Is MVC-ARS preferable to classic MVC to prevent overloading?

还有更多:

http://en.wikipedia.org/wiki/Architectural_pattern_(computer_science)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多