3

我见过的所有关于 MVC 应该是什么以及如何使用的示例都使用类作为模型,类作为控制器,以及 HTML 模板作为视图。所有这些都由一个 index.php 脚本和 url 中的不同请求组成,以运行整个站点。

所以他们都像...

MODEL
class User{
    function getUser($userID){
      $sql = mysql_query('SELECT name......');
      // more code.....
      return $array
    }
}

VIEW
<h2><?php echo $user['name']; ?></h2>

CONTROLLER
class Controller{
    $userModel = new User;
    $userInfo = $userModel->getUser($id);

    $template = new Template('usertemplate.tpl');
    $template->setVariables($userInfo);
    $template->display();
}

我理解为什么模型是由简单地获取和保存数据的类组成的(尽管我认为类并不总是必要的并且可以使用函数)。我理解为什么模板主要由 HTML 组成。但我不明白为什么控制器是一个类。我假设控制器是一个程序脚本(如 userprofile.php,它从模型中获取用户数据并将其发送到模板进行显示)。

另外,我想知道为什么我读过的每个教程都涉及 mod 重写,并使用带有请求的单个页面,如“index.php?user=1”或 index.php?news=3 来运行整个地点。像 user_profile.php?id=1 或 news.php?id=3 这样的单独页面有什么问题...

有人可以帮助我快速“教程”和一路上的解释。就像...如何使用 MVC 实现注册表单,什么会去哪里以及为什么?谢谢你

PS。还有哪些其他类型的设计模式

4

4 回答 4

1

使用带有 URL 中的请求的单个页面,例如“index.php?user=1”或 index.php?news=3 来运行整个站点。像 user_profile.php?id=1 或 news.php?id=3 这样的单独页面有什么问题...

我想,使用单个入口点会使一些事情变得更容易:

  • 您不必复制 user_profile.php 和 news.php 中的任何代码部分
  • 如果您想设置任何类型的过滤器(例如用于安全性的 PHPIDS 或 ACL),您只需修改一个文件,并且为整个应用程序完成。

PS。还有哪些其他类型的设计模式

有很多设计模式;例如,您可以在 wikipedia 上的设计模式(计算机科学)文章中找到一个列表——其中包含指向它们每个页面的链接,以获取更多详细信息。

于 2009-10-12T04:23:39.313 回答
1

在 PHP 的 MVC 版本中,控制器的最大“胜利”是您无需为应用程序响应的每个 URL 提供单独的 PHP 页面。

当您为每个 URL 创建一个新的单个页面时,您希望您的开发人员(或您自己)引入所需的库并以相同的方式初始化模板/布局引擎。即使你是一个单独的开发人员,打破“标准”做事方式的诱惑通常也太强烈了,这意味着每个 URL/PHP 页面最终都是自己的迷你应用程序,而不是每个 URL/ PHP 页面是同一应用程序的一部分。当您有多个开发人员时,这肯定会发生。

最终结果是页面和组件不能很好地相互配合并且难以调试(所有东西都挂在全局命名空间中),给必须从事项目工作的用户和开发人员带来不一致的体验.

MVC 框架还可以更轻松地为您的站点提供友好的 URL。路由系统中通常有足够的事情发生,您不需要求助于大量的查询字符串变量。对于 SEO 和精明的用户来说,可读的 URL 是一个加分项。

最后,尽管这对于大多数商店来说都是天方夜谭,但当您拥有一个控制器时,控制器上的方法就可以轻松进行单元测试。虽然您可以在技术上将测试工具包在非 MVC 站点周围,但这总是让人头疼,而且永远不会像您希望的那样工作。

于 2009-10-12T04:31:02.530 回答
0

为每个动作使用单独的脚本并没有错,事实上,您可以通过这种方式创建 MVC 架构,而无需为控制器使用类。我目前正在开发一个支持这两种样式的 MVC 框架。

重要的是真正保持不同关注点的分离。数据库逻辑放在模型中,布局逻辑放在模板中,其他一切都放在控制器中。

因此,对于一个非常简单的示例,您可以使用以下代码编写脚本“register.php”

$signup_options = SignupOptions::getSignupOptions(); // Load some data      
require("register_form.php");  // Pass it to the view

这个帖子到 register_process.php

$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$email    = $_REQUEST['email'];
Users::Register( $username, $password, $email );
header( 'location: register_success.php' );

MVC 并不适合所有应用程序,因此您应该根据每个项目考虑您的架构。对于许多网站,只需拥有一堆独立的脚本就可以了。然而,对于更大更复杂的应用程序,MVC 已证明自己是一种可靠且可扩展的 Web 应用程序开发方式。

另一种常见的设计模式是“View-Helper”,即直接调用模板,模板调用“Helper”对象,在模板和模型之间执行业务逻辑。概念上类似,但您可以跳过不需要的模板的任何额外代码,同时仍保持 MVC 等关注点分离。(区别本质上是直接调用模板,而不是调用控制器)。

于 2009-10-12T04:22:10.333 回答
0

有几种方法可以实现一个好的应用程序,但我只涉及一些概念。这些概念取自 Samstyle PHP 框架。

首先,你有这些组件:模型(表数据网关)、视图、视图控制器和后端控制器。

这个视图控制器实际上控制了视图的样子(例如显示注册表单)。后端控制器在后端处理用户数据并与模型(数据库)进行交互。

所以在这里我们可以很容易地把 Post-Redirect-Get集成进去。

假设您有用于 View Controller 的register.php,它将显示表单并将内容解析到模板 HTML 文件中。

用户使用表单,提交,然后将被发布到后端控制器deck.php。后端控制器验证、检查然后将数据传递给函数(表数据网关),这将帮助您与数据库进行交互。交互完成后,用户要么被重定向到成功页面,要么被重定向到出现错误的注册页面。

在模型(表数据网关)中,您实际上具有接收数组然后对数据库进行 CRUD 的函数。

于 2009-10-12T04:22:34.963 回答