Blogger Information
Blog 27
fans 0
comment 0
visits 17280
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
030-12月06日-MVC小框架
冇忉丼
Original
835 people have browsed it

MVC小框架

MVC作为一种常用的设计模式,得到了如TP5、Laravel等框架的广泛采用。
下面以电影表为例进行实践

目录结构

model控制器

连接数据库

  1. <?php
  2. /**
  3. * 数据库的基本操作
  4. */
  5. //7个方法实现两类功能:1.创建当前类的单一实例 2.创建数据库的基本操作
  6. //use PDO;
  7. class Db
  8. {
  9. //单例模式--$instance本类的实例
  10. private static $instance = null;
  11. //连接数据库
  12. private $pdo = null;
  13. //数据库的默认连接参数
  14. private $dbConfig=[
  15. 'db'=>'mysql',
  16. 'host'=>'localhost',
  17. 'port'=>'3306',
  18. 'dbname'=>'anguoguo',
  19. 'user'=>'root',
  20. 'password'=>'root',
  21. // 'charset'=>'utf8'//默认字符集有无必要设置
  22. ];
  23. public $insertId = null;//新增主键id
  24. public $num = 0;//新增更改记录
  25. private function __construct($params)
  26. {
  27. //初始化连接参数--因用户可能有自定义的一些参数
  28. $this->dbConfig = array_merge($this->dbConfig,$params);//数组合并
  29. //连接数据库
  30. $this->connect();
  31. }
  32. //禁止外部克隆
  33. private function __clone()
  34. {
  35. // TODO: Implement __clone() method.
  36. }
  37. public static function getInstance($params=[]){
  38. if(!self::$instance instanceof self){
  39. self::$instance = new self($params);
  40. }
  41. return self::$instance;//获取类的单一实例
  42. }
  43. private function connect(){//连接数据库还是在本类中使用,故使用private
  44. try {
  45. //数据源
  46. $dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};
  47. port={$this->dbConfig['port']};dbname={$this->dbConfig['dbname']}";
  48. //创建PDO对象
  49. $this->pdo = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['password']);
  50. // //设置客户端默认字符集 pdo中读和写分开,写是exec,查询是query
  51. // $this->pdo->query("SET NAMES {$this->dbConfig['charset']}");
  52. }catch (PDOException $error){
  53. die('数据库连接失败' . $error->getMessage());
  54. }
  55. }
  56. //数据表的写操作:增、删、改 && 返回受影响的记录
  57. public function exec($sql){
  58. $num = $this->pdo->exec($sql);
  59. if($num>0){
  60. if(!empty($this->pdo->lastInsertId())){//null !==
  61. $this->insertId = $this->pdo->lastInsertId();
  62. }
  63. $this->num = $num;//返回受影响的记录
  64. }else{
  65. $error = $this->pdo->errorInfo();//获取最后操作的的错误信息数组
  66. print '操作失败'.$error[0].':'.$error[1].':'.$error[2];
  67. }
  68. }
  69. //获取单条查询结果
  70. public function fetch($sql){
  71. return $this->pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
  72. }
  73. //获取多条查询结果
  74. public function fetchAll($sql){
  75. return $this->pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  76. }
  77. }

Model.php公共模型类—完成数据库连接及一些公共方法

  1. <?php
  2. class Model
  3. {
  4. protected $db = null;//只给子类调用,数据库连接对象
  5. public $data = null;
  6. public function __construct()
  7. {
  8. $this->init();//初始化的方法,完成数据库链接
  9. }
  10. private function init(){
  11. $dbConfig = [
  12. 'dbname'=>'anguoguo',
  13. 'user'=>'root',
  14. 'password'=>'root',
  15. ];//Db.php中已经定义了---这里是用户的自定义参数,即params
  16. //自定义链接配置覆盖默认参数
  17. $this->db = Db::getInstance($dbConfig);
  18. }
  19. //获取单条数据
  20. public function get($id){
  21. $sql = "SELECT * FROM movies WHERE id={$id}";
  22. return $this->data = $this->db->fetch($sql);
  23. }
  24. //获取全部数据
  25. public function getAll(){
  26. $sql = "SELECT * FROM movies";
  27. return $this->data = $this->db->fetchAll($sql);
  28. }
  29. }

MoviesModel.php放用户自定义的方法

  1. <?php
  2. //用户自定义模型
  3. class MoviesModel extends Model
  4. {
  5. //可以扩展功能
  6. }

用户自定义模型的控制器

MoviesController.php用户自定义模型对应的控制器

  1. <?php
  2. /**
  3. * 电影模块控制器类通常包括:查询,更新,添加,删除
  4. * 模型根据数据表建立,控制器根据模块创建
  5. * 所以一个控制器要完成一个模块的功能,这里完成的查询功能
  6. */
  7. //一张表对应一个模型 控制器中的方法大多是模型操作的具体实现 大多数控制器类的方法都有对应视图文件
  8. class MoviesController//用户自定义控制器,加Controller方便自动加载和明确操作
  9. {
  10. public function listAll(){
  11. //实例化模型,获取数据
  12. $mov = new MoviesModel();
  13. $data = $mov->getAll();//来自父类Model中的方法
  14. // echo '<pre>';//格式化方便查看
  15. // print_r($data);
  16. // 有了视图文件后取代上面的打印
  17. require "H:/Programfile/phpstudy_pro/WWW/html/lecture/easymvc/mvc/view/movies_list.php";
  18. //用相对路径会出错
  19. }
  20. //获取单条数据
  21. public function info($id=1){
  22. $id = isset($_GET['mov_id'])? $_GET['mov_id']:$id;
  23. $mov = new MoviesModel();
  24. $data = $mov->get($id);//来自父类Model中的方法
  25. echo '<pre>';
  26. print_r($data);
  27. }
  28. }

请求分发器(整个项目controller控制器)

index.php项目的入口文件

  1. <?php
  2. //前端控制器--请求分发器,入口文件功能
  3. //加载模型类
  4. require 'model/Db.php';
  5. require 'model/Model.php';
  6. require 'model/MoviesModel.php';
  7. //加载控制器 路由 控制器及控制器中方法
  8. $controller = isset($_GET['c']) ? $_GET['c'] : 'Movies';//判断当前url中是否有c--controller
  9. $controller .= 'Controller';//给控制器添加后缀名
  10. //require 'controller/MoviesController.php';//加载控制器类,方便调用方法
  11. require 'controller/' . $controller . '.php';//加载控制器类,方便调用方法
  12. $action = isset($_GET['a']) ? $_GET['c'] : 'listAll';//获取方法
  13. $mov = new $controller();//实例化自定义控制器类
  14. $mov->$action();//根据电影id,默认为1

视图

用fetch的数据渲染html页面

  1. <!--视图一般用模板引擎来写-->
  2. <!doctype html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport"
  7. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  8. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  9. <title>MVC示例</title>
  10. </head>
  11. <body>
  12. <h2 align="center">电影目录</h2>
  13. <table border="1" cellpadding="5" cellspacing="0" align="center" width="70%">
  14. <tr bgcolor="#6495ed">
  15. <th>ID</th>
  16. <th>片名</th>
  17. <th>图片</th>
  18. <th>详情</th>
  19. <th>分类</th>
  20. </tr>
  21. <?php foreach ($data as $mov): ?>
  22. <!-- MoviesController赋的变量为$data-->
  23. <tr align="center">
  24. <td><?php echo $mov['mov_id']; ?></td>
  25. <td><?php echo $mov['name']; ?></td>
  26. <td><?php echo $mov['image']; ?></td>
  27. <td><?php echo $mov['detail']; ?></td>
  28. <td><?php echo $mov['cate_id']; ?></td>
  29. </tr>
  30. <?php endforeach;?>
  31. </table>
  32. <p align="center">共计:<?php echo count($data); ?>条记录</p>
  33. </body>
  34. </html>

渲染后效果如下:

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:有二点澄清一下: 1. MVC是编程思想,并非设计模式,类似的还是MVVM 2. MVC并非只在TP,Laravel中应用, 只要涉及前后端合作开发, 都可以使用它
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post