我所理解的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背后实际上就是软件开发过程中的解耦过程,把数据操作,业务流程,数据展示这三个层面分离开来,使得程序的开发分别着眼于三个点进行,而不是笼统的乱糟糟的糅杂在一块儿。
当然,这仅仅只是将图书信息展示到前端的表格中来的代码,可以看到,php代码里夹杂了html代码(view层),夹杂了数据库操作代码(Model层),业务逻辑处理代码(Control层),于是一段php代码很长很长。
哈,这样做当然也有好处,最大的好处就是在于方便,快捷,代码写起来很爽,不过本身这个图书管理系统也不复杂。然后其存在的缺点却有很多很多,我觉得关键问题在于代码的维护上,如果一个程序很大了,业务流程相当多,数据处理量比较繁杂,如果笼统把代码写在一起,当然这也是可以的,但一年之后,你再看自己的代码,你会哭的,或者把代码交给别人看,那么,别人必定会骂你,写的是神马玩意儿!
于是,为了代码维护,为了解耦,就提出了我们的MVC分层模型,很多后台开发框架都是应用这个思想,像典型的java开发框架SSH,php的Symfony,都是典型的例子。三层分开之后,数据操作(增删改查)都集中在model层,业务流程操作都集中在Control层,结果的展示则暴露在View层,层与层之间通过接口进行关联,这样的话,我们就可以集中精力各点击破,无论是开发起来,还是后期的代码维护,层次比较清晰,后期添加或删除功能很方便,只需要部分修改,不像flat PHP一样,牵一发而动全身。
这里的name是url后接的参数,可以被获取到,那么通过url
当然,这里仅仅只是用到了控制器的功能,可以看到,我们的视图和业务逻辑还是耦合在一起了,那么如何解耦,就引入了我们的view层,也就是所谓的html模板,采用html模板就可以把view和control分开,具体的一个模板如下:
模板采用twig语义进行编写,具体是什么我们可以不用管,大概就知道这里定义了html的骨架,只不过没有填展示的数据,具体展示的数据怎么填,交给控制器中的方法来做,那么具体的控制器的例子如下:
访问url:
另外,引入数据库之后怎么做Model的分离,这里就是所谓的ORM(Object Relational Mapping),将数据库中的数据表映射到具体的对象中,所有对数据库表格的操作(增删改查)均封装到这个对象中,这就是ORM,典型的ORM在SSH框架中就是Hibernate,当然java框架中的轻量级ORM——ibatis也算。Symfony框架有自己的ORM,就不做具体介绍了。
好了就写到这儿了,大概这就是我所理解的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实例
最近在接触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。
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 软件 bug 的生命周期
- Zend的MVC机制使用分析(二)
- ASP.NET MVC 4 捆绑和缩小实例介绍
- ASP.NET Mvc开发之查询数据
- ASP.NET MVC中将控制器分离到类库的实现
- asp.net实现在非MVC中使用Razor模板引擎的方法
- ASP.NET MVC中的AJAX应用
- 为ASP.NET MVC及WebApi添加路由优先级
- ASP.NET MVC中图表控件的使用方法
- ASP.NET MVC的四种验证编程方式
- 仅30行代码实现Javascript中的MVC
- ASP.NET MVC 3仿Server.Transfer效果的实现方法
- 如何在MVC应用程序中使用Jquery
- ASP.NET MVC小结之基础篇(二)
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(一)
- Asp.net实现MVC处理文件的上传下载功能实例教程
- ASP.NET MVC小结之基础篇(一)
- 12种JavaScript常用的MVC框架比较分析
- 浅析Asp.net MVC 中Ajax的使用