MVC ......如何以及为什么,以及还有哪些其他好的选择(PHP)?

时间:2009-10-12 03:48:43

标签: php model-view-controller separation-of-concerns

我见过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重写,并在url中使用带有请求的单个页面,如“index.php?user = 1”,或者index.php?news = 3运行整个网站。拥有像user_profile.php?id = 1或news.php?id = 3 ...

这样的单独页面有什么问题?

有人可以帮我快速“教程”和解释。就像......如何使用MVC实现注册表单,将会在哪里以及为什么?三江源

PS。还有其他什么样的设计模式

4 个答案:

答案 0 :(得分:1)

  

使用带有请求的单个页面   网址如“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。还有什么样的设计模式   在那里

有很多设计模式;例如,您可以在维基百科上的Design pattern (computer science)文章中找到一个列表,其中包含指向每个页面的链接,以获取更多详细信息。

答案 1 :(得分:1)

PHP的MVC版本中控制器的大“胜利”是你不再为应用程序响应的每个URL都有一个单独的PHP页面。

当您为每个URL创建一个新的单页时,您希望您的开发人员(或您自己)以相同的方式引入所需的库并初始化模板/布局引擎。即使你是一个单一的开发人员,摆脱“标准”做事方式的诱惑通常也会变得过于强烈,这意味着每个URL / PHP页面最终成为自己的迷你应用程序而不是每个URL / PHP页面都是同一个应用程序的一部分。如果您有多个开发人员,则保证会发生这种情况。

最终结果是页面和组件彼此之间不能很好地兼容并且很难调试(所有内容都在全局命名空间中),给用户和必须工作的开发人员带来了不一致的体验关于这个项目。

MVC框架还可以更轻松地为您的网站提供友好的URL。在路由系统中通常会有足够的事情,你不需要需要来诉诸大量的查询字符串变量。对于SEO和精明的用户来说,可读的URL是一个优势。

最后,虽然这是大多数商店在天空中的馅饼,但是当你有一个控制器时,控制器上的方法变得易于单元测试。虽然你可以在技术上将测试工具包裹在非MVC网站周围,但它总是令人痛苦,并且永远不会像你想的那样工作。

答案 2 :(得分: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这样的关注点的分离。 (区别在于您直接调用模板,而不是调用控制器)。

答案 3 :(得分:0)

有几种方法可以实现一个好的应用程序,但我只想谈谈一些概念。这些概念来自Samstyle PHP Framework。

首先,您有以下组件:模型(Table Data Gateway),视图,视图控制器和后端控制器。

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

所以我们可以轻松地将Post-Redirect-Get整合到其中。

假设您有ViewView的 register.php ,它将显示表单并将内容解析为模板HTML文件。

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

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