博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC设计模式
阅读量:4317 次
发布时间:2019-06-06

本文共 10995 字,大约阅读时间需要 36 分钟。

一、概念

  MVC:M (model模型) —— V (view视图) —— C (control控制)

  MVC是一种经典设计模式,其中M(model模型)、V(view视图)、C(control控制),访问者通过请求访问控制层C,C调度M模型获取所需要的信息数据,然后再去加载V视图将节后整合后响应给访问者。

  基于MVC主要是为了解耦合(高内聚,低耦合),优点:易维护、易扩展。MVC结构升级是通过添加内容即可升级。

  使用MVC设计模式搭建的项目结构叫框架

  MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。

二、搭建一个简单的MVC框架

  1. 创建目录:

    ORG              第三方扩展类
    model            M(模型)层目录(M)
    controller           C(控制)层目录(C)
    view             V(视图) 层目录(smarty的模板目录)
    public              公共资源目录
    libs              Smarty库(解压到这里即可)
    view_c             Smarty模板编译目录(可选)
    cache               Smarty静态缓存目录(可选)
    configs             配置文件目录

    index.php          入口文件

  2.在model目录下创建Model.php类

Model.php

1 
tabname = $tabname; 17 //连接数据库 18 $this->link = mysqli_connect(HOST,USER,PASS,DBNAME) or die("数据库连接失败!"); 19 //设置字符编码 20 mysqli_set_charset($this->link,"utf8"); 21 //初始化表字段信息 22 $this->loadFields(); 23 } 24 25 //加载当前表字段信息 26 private function loadFields() 27 { 28 $sql = "desc {
$this->tabname}"; 29 $result = mysqli_query($this->link,$sql); 30 //解析结果 31 while($row = mysqli_fetch_assoc($result)){ 32 //封装字段 33 $this->fields[] = $row['Field']; 34 //判断是否是主键 35 if($row['Key']=="PRI"){ 36 $this->pk = $row['Field']; 37 } 38 } 39 mysqli_free_result($result); 40 } 41 42 //数据查询 43 public function findAll() 44 { 45 $sql = "select * from {
$this->tabname}"; 46 $result = mysqli_query($this->link,$sql); 47 $list = mysqli_fetch_all($result,MYSQLI_ASSOC); 48 mysqli_free_result($result); 49 return $list; 50 } 51 //数据详情 52 public function find($id) 53 { 54 $sql = "select * from {
$this->tabname} where {
$this->pk}={
$id}"; 55 $result = mysqli_query($this->link,$sql); 56 $list = mysqli_fetch_assoc($result); 57 mysqli_free_result($result); 58 return $list; 59 } 60 61 //数据查询 62 public function select() 63 { 64 $sql = "select * from {
$this->tabname}"; 65 66 //判断封装搜索条件 67 if(!empty($this->where)){ 68 $sql .= " where ".implode(" and ",$this->where); 69 } 70 //判断封装排序 71 if(!empty($this->order)){ 72 $sql .= " order by ".$this->order; 73 } 74 //判断封装分页 75 if(!empty($this->limit)){ 76 $sql .= " limit ".$this->limit; 77 } 78 79 $result = mysqli_query($this->link,$sql); 80 $list = mysqli_fetch_all($result,MYSQLI_ASSOC); 81 mysqli_free_result($result); 82 //释放搜索和分页等条件 83 $this->where = array(); 84 $this->order = null; 85 $this->limit = null; 86 87 echo $sql."
"; 88 89 return $list; 90 } 91 92 //获取数据条数 93 public function total() 94 { 95 $sql = "select count(*) as m from {
$this->tabname}"; 96 97 //判断封装搜索条件 98 if(!empty($this->where)){ 99 $sql .= " where ".implode(" and ",$this->where); 100 }101 //执行查询并解析102 $result = mysqli_query($this->link,$sql);103 $row = mysqli_fetch_assoc($result);104 return $row["m"];105 }106 107 //添加方法108 public function insert($data=array())109 { //判断参数是否为空110 if(empty($data)){111 $data = $_POST; //就尝试从POST中获取112 }113 //定义用于存储字段和值信息变量114 $fieldlist = array();115 $valuelist = array();116 //遍历并过要添加的值117 foreach($data as $k=>$v){118 //判断是否是有效字段119 if(in_array($k,$this->fields)){120 $fieldlist[] = $k;121 $valuelist[] = "'".$v."'";122 }123 }124 //拼装sql语句125 $sql = "insert into {
$this->tabname}(".implode(",",$fieldlist).") values(".implode(",",$valuelist).")";126 //echo $sql;127 //发送执行128 mysqli_query($this->link,$sql);129 //返回结果(自增id主键)130 return mysqli_insert_id($this->link);131 }132 133 //信息修改方法134 public function update($data=array())135 { //判断参数是否为空136 if(empty($data)){137 $data = $_POST; //就尝试从POST中获取138 }139 //定义用于存储字段和修改值信息变量140 $fieldlist = array();141 //遍历并过要编辑的值142 foreach($data as $k=>$v){143 //判断是否是有效字段,且不是主键144 if(in_array($k,$this->fields) && $k!=$this->pk){145 $fieldlist[] = $k."='".$v."'";146 }147 }148 //拼装sql语句149 $sql = "update {
$this->tabname} set ".implode(",",$fieldlist)." where {
$this->pk}='{
$data[$this->pk]}'";150 //echo $sql;151 //发送执行152 mysqli_query($this->link,$sql);153 //返回结果(影响行数)154 return mysqli_affected_rows($this->link);155 }156 157 158 //数据删除159 public function del($id)160 {161 $sql = "delete from {
$this->tabname} where {
$this->pk}={
$id}";162 mysqli_query($this->link,$sql);163 return mysqli_affected_rows($this->link);164 }165 166 //封装搜索167 public function where($where)168 {169 $this->where[] = $where;170 return $this;171 }172 173 //封装排序174 public function order($order)175 {176 $this->order = $order;177 return $this;178 }179 180 //封装分页181 public function limit($m,$n=0)182 {183 if($n==0){184 $this->limit = $m;185 }else{186 $this->limit = $m.",".$n;187 }188 return $this;189 }190 191 192 //析构方法,实现数据库关闭193 public function __destruct()194 {195 if($this->link){196 mysqli_close($this->link);197 }198 }199 200 }
View Code

  3.在ORG目录下创建Tpl.php类:用于初始化smarty

Tpl.php

1 
template_dir = "view"; //smarty模板目录 8 $this->compile_dir = "view_c"; //smarty模板编译目录 9 10 $this->config_dir = "configs"; //smarty配置文件目录11 12 $this->cache_dir = "cache"; //smarty模板静态缓存目录13 //$this->caching = true; //是否开启静态缓存14 //$this->cache_lifetime = 3600; //静态缓存时间(秒)15 16 //指定定界符17 $this->left_delimiter="{"; //左定界符18 $this->right_delimiter="}"; //右定界符19 }20 }
View Code

  4.在controller目录下创建Controller类,继承Tpl类,文件名叫:Controller.php 所有控制器的基类

Controller.php

1 
$a();19 }else{20 die("没有找到{
$a}对应的方法");21 } 22 }23 24 }
View Code

  继续添加IndexController.php控制器

1 
Hello World!";7 }8 }
View Code

  5.在最外层创建index.php入口文件:完成自动加载,查找相应的控制器

index.php

1 
init();
View Code

  6.在configs目录下创建config.php配置文件:公共配置文件

1 
View Code

访问入口文件显示:Hello World!

至此一个简单的MVC框架搭建成功!!!

做一个简单的学生信息增删改查,测试一下这个MVC框架

 controller目录下修改IndexController.php和添加StuController.php

1 
测试自己搭建的MVC框架--学生信息管理";7 echo "

1. 学生信息管理

";8 }9 }
View Code
1 
findAll(); 9 $this->assign("list",$list);10 $this->display("index.html");11 }12 //删除学生信息13 public function del()14 {15 $mod = new Model("stu");16 $mod->del($_GET[id]+0);17 header("Location:".$_SERVER["HTTP_REFERER"]);18 }19 //添加学生信息20 public function add()21 {22 $this->display("add.html");23 }24 public function insert()25 {26 $mod = new Model("stu");27 $mod->insert();28 header("Location:index.php?c=Stu&a=index");29 }30 //修改学生信息31 public function edit()32 {33 $mod = new Model("stu");34 $stu=$mod->find($_GET['id']);35 $this->assign("vo",$stu);36 $this->display("edit.html");37 38 }39 public function update()40 {41 $mod = new Model("stu");42 $mod->update();43 header("Location:index.php?c=Stu&a=index");44 }45 }
View Code

view目录下添加以下四个模板

menu.html

1         

学生信息管理

2 浏览信息 |3 添加信息4

View Code

index.html

1  2  3  4     
5 学生信息管理 6 7 8
9 {include file="menu.html" }10 11

浏览学生信息

12
13
14
15
16
17
18
19
20
21 {foreach $list as $vo}22
23
24
25
26
27
28
32
33 {/foreach}34
学号 姓名 性别 年龄 班级 操作
{$vo.id} {$vo.name} {$vo.sex} {$vo.age} {$vo.classid} 29 删除30 编辑31
35
36 37
View Code

add.html

1  2  3      4         
5 学生信息管理 6 7 8
9 {include file="menu.html"}10 11

添加学生信息

12
13
14
15
16
17
18
19
20
24
25
26
27
28
29
30
31
32
33
34
38
39
姓名:
性别: 21 男22 女23
年龄:
班级:
35 36 37
40
41
42 43 44
View Code

edit.html

1  2  3      4         
5 学生信息管理 6 7 8
9 {include file="menu.html"}10 11

编辑学生信息

12
13
14
15
16
17
18
19
20
21
25
26
27
28
29
30
31
32
33
34
35
39
40
姓名:
性别: 22 男23 女24
年龄:
班级:
36 37 38
41
42
43 44 45
View Code

 

转载于:https://www.cnblogs.com/yexiang520/p/5755640.html

你可能感兴趣的文章
github.com加速节点
查看>>
解密zend-PHP凤凰源码程序
查看>>
python3 序列分片记录
查看>>
Atitit.git的存储结构and 追踪
查看>>
atitit 读书与获取知识资料的attilax的总结.docx
查看>>
B站 React教程笔记day2(3)React-Redux
查看>>
找了一个api管理工具
查看>>
Part 2 - Fundamentals(4-10)
查看>>
使用Postmark测试后端存储性能
查看>>
NSTextView 文字链接的定制化
查看>>
第五天站立会议内容
查看>>
ATMEGA16 IOport相关汇总
查看>>
JAVA基础-多线程
查看>>
面试题5:字符串替换空格
查看>>
[Codevs] 线段树练习5
查看>>
Amazon
查看>>
component-based scene model
查看>>
Echart输出图形
查看>>
hMailServer搭建简单邮件系统
查看>>
从零开始学习jQuery
查看>>