博客列表 >php开发简易的mvc框架流程代码演示

php开发简易的mvc框架流程代码演示

kiraseo_wwwkiraercom
kiraseo_wwwkiraercom原创
2022年08月25日 00:08:25415浏览

php开发简易的mvc框架

mvc工作原理

Model:模型类,数据库操作
View:视图类,展示到客户端
Controller:控制器,协调模型与视图
基本架构如下

实际开发效果演示效果

基本框架目录解构

通过入口文件index.php来处理打开对应页面
index.php

  1. <?php
  2. // 带路由解析功能的框架的入口文件
  3. namespace mvc3;
  4. use controller\UserController;
  5. use core\Router;
  6. use model\UserModel;
  7. use core\View;
  8. // 1. 类的自动加载器
  9. require __DIR__ . '/core/autoload.php';
  10. $model = new UserModel('mysql:dbname=phpedu', 'root', 'root');
  11. $view = new View();
  12. // 2. 路由解析
  13. $request = Router::parse();
  14. // echo '<pre>'. print_r($request, true) . '</pre>';
  15. // 2. 实例化控制器
  16. $controller = array_shift($request);
  17. $method = array_shift($request);
  18. $params = array_shift($request);
  19. $controller = 'controller\\'.ucfirst($controller) . 'Controller';
  20. $user = new $controller($model, $view);
  21. // 3. 执行控制器默认方法
  22. call_user_func_array([$user,$method], $params);

Model:模型类,数据库操作(core文件夹)

  1. <?php
  2. namespace core;
  3. use PDO;
  4. // 模型类
  5. // 抽象类, 必须通过子类才可访问
  6. abstract class Model
  7. {
  8. // 1. 连接对象
  9. protected $db = null;
  10. // 2. 实例化时自动连接数据库
  11. public function __construct($dsn, $username, $password)
  12. {
  13. $this->db = new PDO($dsn, $username, $password);
  14. }
  15. // 3. 内置常用操作
  16. // 如select : 获取所有数据列表,默认10条
  17. public function select($num =10)
  18. {
  19. $stmt = $this->db->prepare('SELECT * FROM `user` LIMIT ?');
  20. $stmt->bindParam(1, $num, PDO::PARAM_INT);
  21. $stmt->execute();
  22. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  23. }
  24. // 某取单条记录
  25. public function getOne($id)
  26. {
  27. $sql = 'SELECT * FROM `user` WHERE `id` = ?';
  28. $stmt = $this->db->prepare($sql);
  29. $stmt->bindParam(1, $id, PDO::PARAM_INT);
  30. $stmt->execute();
  31. return $stmt->fetch(PDO::FETCH_ASSOC);
  32. }
  33. }

View:视图类,展示到客户端(core文件夹)

  1. <?php
  2. namespace core;
  3. // 视图类
  4. class View
  5. {
  6. // 1. 模板变量容器
  7. protected array $data = [];
  8. // 2. 模板赋值
  9. public function assign(string $key, $value)
  10. {
  11. $this->data[$key] = $value;
  12. }
  13. // 3. 模板渲染
  14. public function render(string $path, array $data = [])
  15. {
  16. // 支持模型赋值与模板渲染同步进行
  17. // 如果传入了第二个参数,模板变量,则先执行赋值
  18. if ($data) {
  19. foreach ($data as $key=>$value) {
  20. // 调用本类的assign()
  21. $this->assign($key, $value);
  22. }
  23. }
  24. // 将模板变量解析到当前作用域中
  25. extract($this->data);
  26. // 加载模板
  27. file_exists($path) ? include $path : die('模板不存在');
  28. }
  29. }

Controller:控制器,协调模型与视图

  1. <?php
  2. namespace core;(core文件夹)
  3. // 抽象类, 必须通过子类才可访问
  4. abstract class Controller
  5. {
  6. // 1. 模型对象
  7. protected $model;
  8. // 2. 视图对象
  9. protected $view;
  10. // 3. 实例化,初始化模型与视图对象
  11. public function __construct($model, $view)
  12. {
  13. $this->model = $model;
  14. $this->view = $view;
  15. }
  16. }

用户开发页面在controller,model,view这三个文件里面进行写对应的方法,模型,视图操作

controller (UserController.php)

  1. <?php
  2. // 用户管理控制器
  3. namespace controller;
  4. use core\Controller;
  5. // 继承控制器基类
  6. class UserController extends Controller
  7. {
  8. public function __construct($model, $view)
  9. {
  10. parent::__construct($model, $view);
  11. }
  12. // 获取指定id的用户信息
  13. public function get($id)
  14. {
  15. // 1. 模型: 获取数据
  16. $user = $this->model->get($id);
  17. // 2. 视图: 渲染模板
  18. $this->view->render('view/user/get.php', ['user'=>$user]);
  19. }
  20. public function select($num){
  21. // 1. 模型: 获取数据
  22. $users = $this->model->getSelect($num);
  23. // 2. 视图: 渲染模板
  24. $this->view->render('view/user/select.php', ['users'=>$users]);
  25. }
  26. }

model (UserModel.php)

  1. <?php
  2. // 自定义模型类: 用户表user操作
  3. namespace model;
  4. use core\Model;
  5. // 继承模型基类
  6. class UserModel extends Model
  7. {
  8. public function __construct($dsn, $usename, $password)
  9. {
  10. parent::__construct($dsn, $usename, $password);
  11. }
  12. // 获取某个数据
  13. public function get($id)
  14. {
  15. // 调用基类的getOne($id)
  16. return $this->getOne($id);
  17. }
  18. //获取10条数据
  19. public function getSelect($num){
  20. return $this->select($num);
  21. }
  22. }

view (select.php)

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>员工列表</title>
  8. </head>
  9. <body>
  10. <h3>员工列表</h3>
  11. <ul>
  12. <?php foreach ($users as $staff) : extract($staff) ?>
  13. <li><?=$id?> : <?=$name?>, <?=$age?> (
  14. <?=$email?> )
  15. </li>
  16. <?php endforeach ?>
  17. </ul>
  18. </body>
  19. </html>

view (get.php)

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <ul>
  11. <?php foreach ($user as $key => $value) : ?>
  12. <li>[ <?=$key?> ] => <?=$value?></li>
  13. <?php endforeach ?>
  14. </ul>
  15. </body>
  16. </html>

最终输出效果

select方法输出结果

get方法时输出结果

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