您的位置:首页 > 其它

我所理解的MVC

2016-03-03 19:24 363 查看
@原创文章,转载请注明: 转载自 镜中影的技术博客

本文链接地址: 我所理解的MVC)

URL:http://blog.csdn.net/linkpark1904/article/details/50790998

在开发网站的时候,MVC无疑是出现的最多的名词,所谓MVC是个啥呢?字面意思M代表Model,V代表View,C代表Control,我个人觉得MVC背后实际上就是软件开发过程中的解耦过程,把数据操作,业务流程,数据展示这三个层面分离开来,使得程序的开发分别着眼于三个点进行,而不是笼统的乱糟糟的糅杂在一块儿。

Flat PHP vs MVC PHP

刚刚接触php那会儿,记得写了个图书管理系统为了给一门课交差,很快就写完了,在我的另外一篇博客网站的交互理解里面也提到过web服务器的基本交互,php实际上就是CGI应用程序脚本,而一个图书管理系统,无非就是连接数据库,增删改查数据库里面的图书信息,可能还外加一个用户的增删改查功能,但是,当时并没有接触到MVC框架,所以笼统的把所有的业务逻辑,数据库处理逻辑糅杂在一起,于是有了下面这样的代码:

<table class="table table-bordered">
<thead>
<tr class="tableHeader">
<td width="60px">书号</td>
<td width="250px">书名</td>
<td width="80px">作者</td>
<td width="150px">出版社</td>
<td width="140px">日期</td>
<td width="60px">定价</td>
<td width="100px"> 类别</td>
<td width="150px">操作</td>
</tr>
</thead>
<tbody>
<?php
$searchKey = $_REQUEST['searchKey'];
$searchValue = $_REQUEST['searchValue'];

switch($searchKey){
case 1:
$query = "select * from bookInfo where book_name like '%".$searchValue."%'";
break;
case 2:
$query = "select * from bookInfo where book_author like '%".$searchValue."%'";
break;
case 3:
$query = "select * from bookInfo where book_date='".$search."'";
break;
}

$rs = mysql_query($query);
while($row = mysql_fetch_array($rs)){
echo "<tr>";
echo "<td>".$row['book_id']."</td>";
echo "<td>".$row['book_name']."</td>";
echo "<td>".$row['book_author']."</td>";
echo "<td>".$row['book_publish']."</td>";
echo "<td>".$row['book_date']."</td>";
echo "<td>".$row['book_price']."</td>";
echo "<td>".$row['book_kind']."</td>";
echo "<td><a class='deleteBook' href='deleteBook.php?bookId=".$row['book_id']."'>删除</a><a bookid='".$row['book_id']."' class='editBookInfo' href='#'>修改</a></td>";
echo "</tr>";
}
?>
</tbody>


当然,这仅仅只是将图书信息展示到前端的表格中来的代码,可以看到,php代码里夹杂了html代码(view层),夹杂了数据库操作代码(Model层),业务逻辑处理代码(Control层),于是一段php代码很长很长。

哈,这样做当然也有好处,最大的好处就是在于方便,快捷,代码写起来很爽,不过本身这个图书管理系统也不复杂。然后其存在的缺点却有很多很多,我觉得关键问题在于代码的维护上,如果一个程序很大了,业务流程相当多,数据处理量比较繁杂,如果笼统把代码写在一起,当然这也是可以的,但一年之后,你再看自己的代码,你会哭的,或者把代码交给别人看,那么,别人必定会骂你,写的是神马玩意儿!

于是,为了代码维护,为了解耦,就提出了我们的MVC分层模型,很多后台开发框架都是应用这个思想,像典型的java开发框架SSH,php的Symfony,都是典型的例子。三层分开之后,数据操作(增删改查)都集中在model层,业务流程操作都集中在Control层,结果的展示则暴露在View层,层与层之间通过接口进行关联,这样的话,我们就可以集中精力各点击破,无论是开发起来,还是后期的代码维护,层次比较清晰,后期添加或删除功能很方便,只需要部分修改,不像flat PHP一样,牵一发而动全身。



MVC实例

最近在接触php的框架symfony2,感觉这个框架的mvc分层比较好,控制器作为MVC整个框架承上启下的模块相对比较重要。控制器的在symfony2中的具体实现实际上就是返回相应响应的PHP函数或类方法。前面用户通过具体的url来访问到相应的控制器,当然url到具体控制器有一层映射关系也存在在symfony2框架中,在这里被称作路由,一个具体实例的路由配置如下所示:

#routing.yml
acme_hello_homepage:
path:     /hello/{name}
defaults: { _controller: AcmeHelloBundle:Hello:index }


这里的name是url后接的参数,可以被获取到,那么通过url
http://你的主机ip或域名/hello
就可以访问到名为HelloController的控制器中的indexAction方法,具体这个控制器的实现如下:

#HelloController.php
<?php

namespace Acme\HelloBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class HelloController extends Controller
{
public function indexAction($name)
{
return new Response('<html><body>Hello '.$name.'!</body></html>');
}
}


当然,这里仅仅只是用到了控制器的功能,可以看到,我们的视图和业务逻辑还是耦合在一起了,那么如何解耦,就引入了我们的view层,也就是所谓的html模板,采用html模板就可以把view和control分开,具体的一个模板如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>{% block title %}Welcome!{% endblock %}</title>
{% block stylesheets %}{% endblock %}
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
</head>
<body>
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>


{ extends '上述模板文件名' %} #这部分代码不是这样子的,hexo这个平台会执行这个难道是bug?
{ block body %}
Hello: { name }}
{ endblock %}


模板采用twig语义进行编写,具体是什么我们可以不用管,大概就知道这里定义了html的骨架,只不过没有填展示的数据,具体展示的数据怎么填,交给控制器中的方法来做,那么具体的控制器的例子如下:

<?php
// src/Acme/HelloBundle/Controller/HelloController.php
namespace Acme\HelloBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HelloController extends Controller
{
public function indexAction($name)
{
return $this->render('AcmeHelloBundle:Hello:index.html.twig',
array('name' => $name));
}
}
?>


访问url:
http://你的ip或者域名/Hello/world
于是便有了hello world了,这里模板把控制器和视图分开,控制器和视图之间仅仅只是数据驱动,不涉及到具体的业务流程,这样,前端开发的人员就彻底和后台做业务的人员分开,两者间的交互通过数据来进行也就是上述代码中的array(‘name’=>$name),这样就把Control和View做了一个分离。

另外,引入数据库之后怎么做Model的分离,这里就是所谓的ORM(Object Relational Mapping),将数据库中的数据表映射到具体的对象中,所有对数据库表格的操作(增删改查)均封装到这个对象中,这就是ORM,典型的ORM在SSH框架中就是Hibernate,当然java框架中的轻量级ORM——ibatis也算。Symfony框架有自己的ORM,就不做具体介绍了。

好了就写到这儿了,大概这就是我所理解的MVC。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvc 软件开发