我所理解的MVC

@原创文章,转载请注明: 转载自 镜中影的技术博客
本文链接地址: 我所理解的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架构图

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值