我见过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。还有其他什么样的设计模式
答案 0 :(得分:1)
使用带有请求的单个页面 网址如“index.php?user = 1”,或 index.php?news = 3来运行整个 现场。分开是错的 像user_profile.php?id = 1的页面,或 news.php?ID = 3 ...
我认为使用单个入口点可以简化某些操作:
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。