php mvc单入口搭建,php源码之实现单入口MVC结构的方法

这篇文章主要介绍了关于php源码之实现单入口MVC结构的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

主要:MVC目录结构

数据库工具类制作

创建公共模型类和公共控制器类--------------:--------------------------------------

blog

├─index.php 入口文件

├─Model 模型

│ └─UserModel.class.php 用户模型类

├─View 视图

│ └─login.html 登录表单页面

├─Controller 控制器

│ └─UserController.class.php 用户控制器

├─Frame 公共使用的类

│ ├─BaseModel.class.php 数据库连接类

│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)

│ └─Db.class.php 数据库操作工具类

└─Public 静态公共文件(js,css,images)

├─js/ js文件

├─css/ css样式文件

└─images img图片

-----------------------------------------------------------------

MVC目录结构

1)准备: 创建分支1 $ git checkout master2 $ git checkout -b "mvc-dbtools-base"

2) 创建目录结构:

MVC目录: Model/ Controller/ View/

静态资源目录: Public/

3) 创建项目入口文件 【index.php】

拷贝原login.php的编码header(...)

引入创建的控制器UserController 和 模型 UserModel1 <?php

2 /**

3 * 入口文件

4 */

5 header("content-type:text/html;charset=utf-8");

6

7 require_once('Model/UserModel.class.php');

8 require_once 'Controller/UserController.class.php';

9

10 //实例化控制器

11 $userCtr = new UserController();

12

13 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';

14

15 $userCtr -> $a();

4) 创建控制器UserController 【Controller/UserController.class.php】1 <?php

2 /**

3 * UserController.class.php 用户控制器

4 */

5

6 class UserController {

7 /**

8 * 展示登录界面

9 * @access public

10 */

11 public function login()

12 {

13 include "View/login.html";

14 }

15

16 /**

17 * 登录操作: 校验登录信息

18 */

19 public function dlogin()

20 {

21 //接收登录信息

22 $data = array();

23 $data['username'] = trim($_POST['username']);

24 $data['pwd'] = trim($_POST['pwd']);

25

26 //实例化模型,调用模型方法,校验用户名和密码

27 $model = new UserModel();

28 $result = $model->checkLoginInfo($data);

29

30 //结果提示信息

31 if($result){

32 exit('登录成功');

33 } else {

34 echo "用户名或密码不正确!";

35 header('refresh:3; url=?');

36 }

37 }

38 }

5) 创建用户模型类UserModel 【Model/UserModel.class.php】

实现方法:checkLoginInfo() 检验用户名和密码<?php /**

* UserModel.class.php

* 用户模型类-操作表pbg_users */class UserModel

{ /**

* 检验登录信息

* @param array $data 用户提交的登录信息

* @return bool

true-校验成功 false-校验失败 */

public function checkLoginInfo($data)

{ //连接数据库

$conn = @mysql_connect('localhost','root','root') or die('连接数据库失败!');

mysql_query('set names utf8',$conn);

mysql_query('use web',$conn); //查询数据库

$sql = "select username,pwd from pbg_users where username='{$data['username']}'";

$res = mysql_query($sql,$conn); //登录结果提示信息

if($res !== false){

$user = mysql_fetch_array($res);

if( $user['pwd'] == md5($data['pwd']) ){

return true;

}

} return false;

}

}

查看用户模型类

6)登录视图:【view/login.html】

引入路径的修正,

表单提交action修正: action=?a=dlogin1

2

3

4

5

登录

6

7

8

9

10

11

12

13

14

登录

15


16

17

18 用户名:

19

20

21

22 23 24

25 密   码:

26

27

28

29 30 31

32

33 登录

34 重置

35

36 37 38 39 40 41 46 47

点击查看登录视图源码

数据库连接操作都在模型中,可以提取出来制作数据库操作工具类

数据库工具类制作

数据库连接,设置编码,选择数据库

实现单例

获取一行数据getOneRow, 获取单个数组 getOneData, 获取多行getAllRows, 增删改 exec

自动生成insert 或 update语句 autoExecute()

【Frame/Db.class.php】1 <?php

2 /**

3 * Db.class.php 数据库操作工具类

4 * @author young

5 */

6

7 class Db

8 {

9 private $host; //主机

10 private $user; //用户名

11 private $pwd; //密码

12 private $port; //端口

13 private $charset; //编码

14 private $dbname; //数据库

15

16 private $link=null; //存储数据库资源

17 private static $instance=null; //存储本类实例对象

18

19 /**

20 * 构造方法: 保存数据库连接信息,连接数据库

21 * @access private

22 * @param array $conf 数据库连接信息

23 */

24 private function __construct($conf)

25 {

26 $this->host = !empty($conf['host']) ? $conf['host'] : 'localhost';

27 $this->user = !empty($conf['user']) ? $conf['user'] : 'root';

28 $this->pwd = !empty($conf['pwd']) ? $conf['pwd'] : 'root';

29 $this->port = !empty($conf['port']) ? $conf['port'] : '3306';

30 $this->charset = !empty($conf['charset']) ? $conf['charset'] : 'utf8';

31 $this->dbname = !empty($conf['dbname']) ? $conf['dbname'] : 'web';

32

33 $this->connect();

34 }

35

36 /**

37 * 连接数据库,设置编码,选库

38 * @access private

39 */

40 private function connect()

41 {

42 $this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") or die('连接失败!'.mysql_error());

43 $this->setCharset($this->charset);

44 $this->useDb($this->dbname);

45 }

46 /**

47 * 设置字符便

48 * @access public

49 * @param string $char 字符编码

50 */

51 public function setCharset($char)

52 {

53 $this->query("set names $char");

54 }

55 /**

56 * 选择数据库

57 * @access public

58 * @param string $dbname 数据库名称

59 */

60 public function useDb($dbname)

61 {

62 $this->query("use $dbname");

63 }

64

65 /**

66 * 执行sql语句

67 * @param string $sql sql语句

68 * @return mixed

69 */

70 private function query($sql)

71 {

72 $result = mysql_query($sql, $this->link);

73 if(false === $result) {

74 echo "

sql执行失败!
";

75 echo "
失败语句:".$sql;

76 echo "
错误代号".mysql_errno();

77 echo "
错误提示: ".mysql_error()."

";

78 exit();

79 }

80 return $result;

81 }

82

83 /**

84 * 获取本类实例

85 * @access public

86 * @param array $conf 数据库连接信息

87 * @return object 本类的单例对象

88 */

89 public static function getDb($conf)

90 {

91 if(false === (static::$instance instanceof static)){

92 static::$instance = new static($conf);

93 }

94 return static::$instance;

95 }

96 /**

97 * 禁止克隆

98 */

99 public function __clone()

100 {

101

102 }

103 /**

104 * 关闭数据库连接

105 * @access public

106 */

107 public function closeDb()

108 {

109 mysql_close($this->link);

110 }

111

112 public function exec($sql)

113 {

114 $result = $this->query($sql);

115 return $this->affectedRows();

116

117 }

118 /**

119 * 受影响的行数

120 * @return int 返回受影响的行数

121 */

122 private function affectedRows()

123 {

124 return mysql_affected_rows($this->link);

125 }

126

127 /**

128 * 执行 “返回一行数据”的查询

129 * @param string $sql sql语句

130 * @return array 一维数组(一行)

131 */

132 public function getOneRow($sql)

133 {

134 $result = $this->query($sql);

135 $data = mysql_fetch_assoc($result);

136 mysql_free_result($result);

137 return $data;

138 }

139 /**

140 * 执行 "返回多行数据" 的查询

141 * @param string $sql sql语句

142 * @return array 二维数组

143 */

144 public function getAllRows($sql)

145 {

146 $result = $this->query($sql);

147 $data = array();

148 while($row = mysql_fetch_assoc($result)){

149 $data[] = $row;

150 }

151 mysql_free_result($result);

152 return $data;

153 }

154 /**

155 * 执行“获取一个数据”的查询

156 * @param string $sql sql语句

157 * @return mixed 标量数据值

158 */

159 public function getOneData($sql)

160 {

161 $result = $this->query($sql);

162 $data = mysql_fetch_row($result);

163 mysql_free_result($result);

164 return $data[0];

165 }

166

167 /**

168 * 上次insert时的自增长id值

169 * @return int insert时的id值

170 */

171 public function getInsertId()

172 {

173 return mysql_insert_id($this->link);

174 }

175

176 /**

177 * 序列化时,对指定数据进行序列化

178 * @return array 指定进行序列化的数据

179 */

180 public function __sleep()

181 {

182 return array('host', 'port', 'user', 'pass','charset', 'dbname');

183 }

184 /**

185 * 反序列化时,使用相应数据连接数据库

186 */

187 public function __wakeup()

188 {

189 $this->connect(); //连接数据库

190 }

191 /**

192 * 自动生成insert语句或update语句

193 * @param array $data insert或update的数据

194 * @param string $table 操作的数据表

195 * @param string $act 是update还是insert操作

196 * @param string $where where条件 如 id=2 如果是update必须加,否则不执行直接返回false

197 * @return bool 执行insert与update的结果

198 */

199 public function autoExecute($data, $table, $act='insert', $where='')

200 {

201 if($act == 'insert') {

202 $sql = "insert into ".$table."(";

203 $sql .=implode(",", array_keys($data));

204 $sql .= ") values ('";

205 $sql .= implode("','", array_values($data));

206 $sql .= "')";

207

208 $res = $this->exec($sql);

209 return $this->getInsertId();

210

211 } else if($act == 'update') {

212 if(!$where) { return false; }

213 $sql = 'update '.$table.' set ';

214 foreach ($data as $k => $v) {

215 $sql .= $k."='".$v."',";

216 }

217 $sql = substr($sql, 0, -1);

218 $sql .= ' where '.$where;

219

220 return $this->exec($sql);

221 } else {

222 return false;

223 }

224

225 }

226 }

点击查看工具类

创建公共模型类和公共控制器类

1) 公共模型类【Frame/BaseModel.class.php】 获取数据库操作工具类实例1 <?php

2

3 /**

4 * BaseModel.class.php 基础模型类

5 * 连接数据库

6 */

7 class BaseModel

8 {

9 protected $db = null;

10 /**

11 * 构造方法: 实例化数据库类

12 * @access public13 * @param array $config 数据库配置信息

14 */

15 function __construct(array $config=null)

16 {

17 $conf = array(

18 'host'=>'localhost',

19 'user'=>'root',

20 'pwd'=>'root',

21 'port'=>'3306',

22 'charset'=>'utf8',

23 'dbname'=>'web',

24 );

25 $conf = empty($config)? $conf : array_merge($conf,$config);

26 $this->db = Db::getDb($conf);

27 }

28 }

2) 公共控制器类【Frame/BaseController】 :

统一了编码

提示信息跳转1 <?php

2 /**

3 * BaseController.class.php 公共控制器

4 * @author young

5 */

6

7 class BaseController

8 {

9 /**

10 * 统一编码utf8

11 */

12 public function __construct()

13 {

14 header("content-type:text/html;charset=utf-8");

15 session_start();

16 }

17

18 /**

19 * 跳转提示

20 * @access public

21 * @param string $msg 跳转提示信息

22 * @param string $url 跳转的地址

23 * @param integer $time 等待时间 秒数

24 */

25 public function msg($msg='', $url='?', $time=3)

26 {

27 echo "

返回

页面将在{$time}秒之后跳转!!";

28 header("refresh: $time; url=$url");

29 exit("

$msg

");

30 }

31 }

3)入口文件中引入工具类,基础模型和基础控制器类

【index.php】1 <?php

2 /**

3 * 入口文件

4 */

5 require_once 'Frame/Db.class.php';

6 require_once 'Frame/BaseModel.class.php';

7 require_once('Model/UserModel.class.php');

8 require_once 'Frame/BaseController.class.php';

9 require_once 'Controller/UserController.class.php';

10

11 //实例化控制器

12 $userCtr = new UserController();

13

14 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';

15

16 $userCtr -> $a();

点击查看入口文件

4)用户模型类优化 【Model/UserModel.class.php】1 <?php

2

3 /**

4 * UserModel.class.php

5 * 用户模型类-操作表pbg_users

6 */

7 class UserModel extends BaseModel

8 {

9 /**

10 * 检验登录信息

11 * @param array $data 用户提交的登录信息

12 * @return bool true-校验成功 false-校验失败

13 */

14 public function checkLoginInfo($data)

15 {

16 $sql = "select id,username,pwd from pbg_users where username='{$data['username']}'";

17 $res = $this->db->getOneRow($sql);

18 return $res['pwd'] == md5($data['pwd']) ? : false;

19 }

20 }

5) 用户控制器登录操作,跳转提示优化

使用公共控制器方法msg()1 。。。。。。。

2 /**

3 * 登录操作: 校验登录信息

4 */

5 public function dlogin()

6 {

7 //接收登录信息

8 $data = array();

9 $data['username'] = trim($_POST['username']);

10 $data['pwd'] = trim($_POST['pwd']);

11

12 //实例化模型,调用模型方法

13 $model = new UserModel();

14 $result = $model->checkLoginInfo($data);

15 //跳转提示

16 if($result){

17 $this->msg('登录成功!', '?a=index',3);

18 } else {

19 $this->msg('用户名或密码不正确!!');

20 }

21 }

合并保存并推送git1 $ git add -A

2 $ git commit -m "MVC结构,数据库操作类,基础模型类和基础控制器类制作"

3 $ git checkout master

4 $ git merge mvc-dbtools-base

5 $ git push origin master

小结: 优化目录结构,制作数据库操作类,基础模型类与基础控制器类使用

下一步: 模型类实现单例, 进一步优化目录结构,区分平台(如前台,后台)

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值