设为首页 收藏本站
查看: 933|回复: 0

[经验分享] PHP开发之MVC架构

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-25 07:32:53 | 显示全部楼层 |阅读模式
MVC是Model(模型)-View(视图)-Controlller(控制器)的简称。
MVC是一种软件开发架构,在近几年的Web应用开发中非常流行。简单的说,这三件事情还是很简单。Model是负责如何与数据库交互,它是后端的PHP OO类库,其它语言比如Ruby on Rails或C++、Java亦同;View基本上是前端的用户界面。Controller负责处理操作商业逻辑,在前两者之间协作。
这些看似容易解释,但有时这个概念也有点抽象,比较难以把握。
坦率地说,我这么多年的Web开发中,我也没有真正研究MVC的细节,虽然我的书中也有介绍。直到最近,一些读者开始向我请教这方面的问题。
在本篇文章中,我希望向大家解析一下PHP MVC这一强大架构的开发,希望给各位PHP开发者提供一些帮助。  MVC与 PHP 开发
Model-View-Controller这种结构划分,实际上有很多思想参考,实际上是软件开发发展历程中开发大型项目的自然发展结果。比如 Java的Class, JSP和Struts;Ruby on Rails内置了MVC的结构;虽然PHP和这些有点不太一样,但它并不意味着我们不能做。
  Model层
MVC结构是用在较大的项目上应用,利用OO进行编码。Model层在一个PHP 应用程序中,通常是一个类(或多个)。通常情况下,这个类是处理或保存数据表,如操作数据库中的会员表记录,查询会员记录等方法。
比如,我们有一个User类,有一些变量,比如username,password,email,以及其他的方法,如新的用户的创建,登录,验证,注销等方法。
  稍候,我们将看如何将User这个对象用在应用程序Controller的一部分。
Model在本质上,告诉你有什么方法可供选择-即在数据库中如何操作数据。
我想我必须澄清(如果不是已经明确的) -这应该是PHP的全部代码,也正是我们要用OO开发原因之一。
即使没有明确使用MVC,这部分代码不应有HTML或任何的输出(重定向等)处理,如果已经有这种操作或必须需要输出,则要通过一个参数处理或返回值。 (这是编程的最基本素质,但目前的情况是,多数Web程序员没有什么学位或没学过计算机… )
下面是Model模型的代码,在一个真正的Web应用上,这仅仅是最简单的代码,它没有完成所有的细节。
class User
{
public $username;
public $password;
public $email;
function __constructor ($u, $p, $e)
{
$this->username = $u;
$this->password = $p;
$this->email = $e;
}
function create()
{
//在用户表中插入记录
}
function login()
{
// 检查用户表,是否已经登录
}
static function authenticate($u, $p)
{
// 验证用户表
$query = “SELECT * FROM users WHERE user_name={$u} AND password = {$p}”;
$result = mysql_query($query);
$row = mysql_fetch_array($result);
  if(count($row)==0){
return false;
}else{
return true;
}
}
function logout()
{
//用户退出登录
}
}
View层
View层最简单的说,就是用户界面。不过,这并不意味着它只是HTML 。我们还是须在应用程序界面加入一些PHP逻辑处理。比如,如果在登录的网站上显示, “您好, [UserName] ”,这里一定会需要一些PHP代码来处理,对不对?这就是关于View的说明。当然,所有的CSS 、JavaScript也都是Viewn层的一部分。
这是非常重要的,无论PHP代码在这里,只是需要采取哪些用来显示界面正确。没有额外的“行动”代码属于看法-这是控制器的工作,我们将看到未来。
这是非常重要的,无论如何都要用PHP代码来处理显示正确的界面。强调一点的是,View层没有任何“action”的代码,这部分是Controller的工作,稍候我们介绍。
各位,是不是很容易理解呢,为了更透彻的理解,让我们来看一个例子。以下代码没有使用XHTML 1.0规范 ,仅做参考。
<?php
require_once(’User.php’);
//验证用户是否已经登录
if (User::authenticate($_COOKIE['username'], $_COOKIE['password']))
{
header(”Location:/my.php”);
exit();
}
?>
<html>
<head><title>请登录</title></head>
<body>
<h1>登录</h1>
<?php
if ($_GET['error'] == 1)
{
echo ‘用户名或密码错误,请重新登录.<br />’;
}
?>
<form action=”login_action.php” method=”post”>
用户名: <input type=”text” name=”username” /><br />
密码: <input type=”password” name=”password” /><br />
<input type=”submit” value=”登录” />
</form>
  </body>
  </html>

  View层目前可以使用Smarty等模板类来处理。
  Controller层
如果你没有实际的开发工作经验或读过相关书籍或文章,有时候很容易混淆Controller的定义。和View层一样,Controller一样重要,我们一起来看一个例子。
现在我们有一个登录页面,即一个HTML表单指向某个URL(除非使用AJAX),我们不应该直接指向Model文件(如User.php),因为该文件仅仅是一个类代码,因此它不会做任何事情。也不应该提交给View层文件(叫login.php),因为它仅做显示的界面。
这就是控制器-Controller的作用,你的表单应该提交到一个叫login_action.php的文件。在此文件中,您可以创建一个User类的实例,初始化后,使用合适的方法来处理登录 。
大多数开发者都从Controller里输出,因为写起来很方便。如果有一个登录表单, 它只是打印“登录不正确”这样的字眼,看起来的确很简单。
不过要真正利用的MVC架构优势,Controller控制器(类似于Model)应该不会有任何HTML输出,而是使用重定向操作。我们可以使用cookies/SESSION,数据库存储,文件缓存,或查询字符串给View层文件,在View层中实现显示输出以及保存状态等动作。
现在让我们看一个Controller控制器代码。
<?php
require_once(’User.php’);
//检查用户名密码是否正确
$currentuser = new User($_POST['username'], $_POST['password'], ”);
if ($currentuser->login())
{
// 设置Cookie,重定向到主页
header(”Location:/main.php”);
exit();
}
else
{
//错误,重定向到登录页
header(”Location:/login.php?error=1&Prime;);
exit();
}
?>
总结
使 用MVC结构的代码更易于理解。对于其他开发者进入开发时会更快到位,当自己在过一段时间翻回来看这段程序时也容易得多,
因为我们很确定地知道,在哪里找什么样的代码。如果要改变一些信息在显示界面,你只需要看View层程序。如果数据库结构发生变化,比如密码加密形式不同,只需要更改Model层程序。
通过以上我们看到MVC架构的优点和强大之处,它将让基于OO的Web开发变得更有效率。
有任何问题或不足之处,敬请指出。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103736-1-1.html 上篇帖子: php入门学习——php与jsp对比 下篇帖子: TEA 加密解法,统一了C语言、Java与PHP的运算结果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表