php源码之实现单入口MVC结构的方法

php源码之实现单入口MVC结构的方法

内容导读

收集整理的这篇技术教程文章主要介绍了php源码之实现单入口MVC结构的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含15593字,纯文字阅读大概需要23分钟

内容图文

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

主要:

  1. MVC目录结构

  2. 数据库工具类制作

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

--------------:--------------------------------------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 和 模型 UserModel

 1 <?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=dlogin

 1 <!DOCTYPE html>
2 <html lang="zh-CN">
3 <head>
4

 <meta charset="UTF-8">
5

 <title>登录</title>
6

 <link rel="stylesheet" type="text/css" href="public/layui/css/layui.css">
7

 <link rel="stylesheet" type="text/css" href="public/css/style.css">
8 </head>
9 <body> 10 <p class="container"> 11

 <p class="content"> 12



 <form action="?a=dlogin" class="layui-form" method="post"> 13





 <p class="layui-form-item"> 14







 <h2>登录</h2> 15





 </p><hr> 16
17





 <p class="layui-form-item"> 18







 <label class="layui-form-label">用户名:</label> 19







 <p class="layui-input-block"> 20









 <input type="text" name="username" class="layui-input" required
lay-verify="required"
placeholder="请输入用户名" autocomplete="off" > 21







 </p>22





 </p>23 24





 <p class="layui-form-item">25







 <label class="layui-form-label">密&nbsp;&nbsp;&nbsp;码:</label> 26







 <p class="layui-input-block">27









 <input type="password" name="pwd" required lay-verify="required" placeholder="请输入密码"
class="layui-input"> 28







 </p>29





 </p>30 31





 <p class="layui-form-item"> 32







 <p class="layui-input-block"> 33









 <button
lay-submit class="layui-btn">登录</button> 34









 <button type="reset" class="layui-btn layui-btn-primary">重置</button> 35







 </p>36





 </p>37



 </form>38

 </p>39 </p>40 <script type="text/javascript" src="public/layui/layui.js"></script>41 <script> 42

 layui.use('form', function(){43



 var form = layui.form;44

 });45 </script>46 </body>47 </html>


点击查看登录视图源码

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

数据库工具类制作

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

实现单例

获取一行数据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 "<p>sql执行失败!<br>";
 75






echo "<br>失败语句:".$sql;
 76






echo "<br>错误代号".mysql_errno();
 77






echo "<br>错误提示: ".mysql_error()."</p>";
 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 "<p><a href='$url'>返回</a></p>页面将在{$time}秒之后跳转!!"; 28



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



 exit("<p><span style='color:red'>$msg</span></p>"); 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

 }

合并保存并推送git

1 $ git add -A2 $ git commit -m "MVC结构,数据库操作类,基础模型类和基础控制器类制作"3 $ git checkout master4 $ git merge mvc-dbtools-base5 $ git push origin master

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

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

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

相关推荐:

浅谈PHP源码五:关于array 数组的创建

浅谈PHP源码一:explode和implode函数

以上就是php源码之实现单入口MVC结构的方法的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的php源码之实现单入口MVC结构的方法全部内容,希望文章能够帮你解决php源码之实现单入口MVC结构的方法所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com