博客列表 >MVC初学

MVC初学

阿杰
阿杰原创
2022年07月11日 18:04:57515浏览

一、mvc原理流程图

二、自定义一个mvc

(1)创建配置文件config

  1. // 数据库连接参数
  2. define('DATABASE',[
  3. 'type'=>'mysql',
  4. 'host'=>'localhost',
  5. 'dbname'=>'mydb',
  6. 'port'=>'3306',
  7. 'charset'=>'utf8',
  8. 'username'=>'myshop',
  9. 'password'=>'yzj123'
  10. ]);
  11. // 应用相关
  12. define('APP', [
  13. // 默认控制器
  14. 'default_controller'=>'index',
  15. // 默认方法
  16. 'default_action'=>'index'
  17. ]);
  18. // 项目根路径
  19. define('ROOT_PATH',__DIR__);

(2)创建核心类库

  • Model
  1. namespace phpcn;
  2. use PDO;
  3. class Model
  4. {
  5. // 连接对象
  6. protected $db;
  7. // 模型实例化时,应该将数据库连接上,为后面的操作做好准备
  8. public function __construct($dsn, $username, $password)
  9. {
  10. $this->db = new PDO($dsn, $username, $password);
  11. }
  12. // 通常模型类中,会预置一些公共方法,供用户进行数据库操作
  13. // 获取分页数据(多条)
  14. public function getAll($n = 10)
  15. {
  16. $stmt = $this->db->prepare('SELECT * FROM `staff` LIMIT ?');
  17. // 默认绑定的都是字符串类型
  18. $stmt->bindParam(1, $n, PDO::PARAM_INT);
  19. $stmt->execute();
  20. // print_r($stmt->debugDumpParams());
  21. return $stmt->fetchAll();
  22. }
  23. }
  • View
  1. namespace phpcn;
  2. class View
  3. {
  4. public function display($data)
  5. {
  6. // 1. 模型赋值
  7. $staffs = $data;
  8. // 2. 渲染模型
  9. include ROOT_PATH . '/view/' . 'show.php';
  10. }
  11. }
  • Controller
  1. namespace phpcn;
  2. class Controller
  3. {
  4. // 模型对象
  5. protected $model;
  6. // 视图对象
  7. protected $view;
  8. // 控制器类实例时,要确保模型和视图对象可用
  9. public function __construct($model, $view)
  10. {
  11. $this->model = $model;
  12. $this->view = $view;
  13. }
  14. public function index()
  15. {
  16. // 1. 模型: 获取数据
  17. $data = $this->model->getAll(5);
  18. // 2. 视图: 渲染模板
  19. $this->view->display($data);
  20. }
  21. }

(3)增加选择控制器功能

  • model:StaffModel
  1. namespace phpcn;
  2. // 用户自定义模型
  3. class StaffModel extends Model
  4. {
  5. // 复用
  6. }
  • view:show
  1. <table border="1" cellspacing="0" cellpadding="5" width="400">
  2. <caption style="font-size: 1.2em;">员工信息表</caption>
  3. <thead bgcolor="lightcyan">
  4. <tr>
  5. <th>id</th>
  6. <th>姓名</th>
  7. <th>性别</th>
  8. <th>邮箱</th>
  9. <th>操作</th>
  10. </tr>
  11. </thead>
  12. <tbody align="center">
  13. <?php foreach ($staffs as [$id, $name, $sex, $email]) : ?>
  14. <tr>
  15. <td><?= $id ?></td>
  16. <td><?= $name ?></td>
  17. <td><?= $sex ? '女' : '男' ?></td>
  18. <td><?= $email ?></td>
  19. <td>
  20. <a href="">编辑</a>
  21. <a href="">删除</a>
  22. </td>
  23. </tr>
  24. <?php endforeach ?>
  25. </tbody>
  26. </table>
  • controller:IndexController
  1. namespace phpcn;
  2. // 默认控制器
  3. class IndexController extends Controller
  4. {
  5. // ...
  6. }
  • controller:UserController
  1. namespace phpcn;
  2. // 自定义控制器
  3. class UserController extends Controller
  4. {
  5. public function hello()
  6. {
  7. return '<h2>Hello world</h2>';
  8. }
  9. }

(4)url 参数解析

  1. namespace phpcn;
  2. // 加载配置项
  3. require __DIR__ .'/config.php';
  4. // 加载框架的核心类型
  5. require __DIR__.'/core/Controller.php';
  6. require __DIR__.'/core/Model.php';
  7. require __DIR__.'/core/View.php';
  8. // 加载自定义模型
  9. require __DIR__.'/model/StaffModel.php';
  10. // 将关联数组结构成一个个独立变量
  11. extract(DATABASE);
  12. // 实例化模型类
  13. $dsn = sprintf('%s:dbname=%s',$type,$dbname);
  14. $model = new StaffModel($dsn,$username,$password);
  15. // http://phpedu.com/0506/0506/mvc3/index.php?c=controller&a=action
  16. // c=控制器,a=控制器的方法
  17. $c = $_GET['c'] ?? APP['default_controller'];
  18. $a = $_GET['a'] ?? APP['default_action'];
  19. // 获取类名
  20. $class = ucfirst($c).'Controller';
  21. // 加载自定义控制器
  22. require __DIR__.'/controller/'.$class.'.php';
  23. // 加载视图类
  24. $view = new View();
  25. // 完整控制器类名
  26. $fullclass = __NAMESPACE__.'\\'.$class;
  27. $controller = new $fullclass($model,$view);
  28. // 执行控制器中的index()
  29. echo $controller->$a();

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