博客列表 >030-12月06日-MVC小框架

030-12月06日-MVC小框架

冇忉丼
冇忉丼原创
2019年12月15日 23:21:09836浏览

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>

渲染后效果如下:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议