博客列表 >php开发简易的mvc框架

php开发简易的mvc框架

P粉191340380
P粉191340380原创
2022年09月03日 01:42:40439浏览

MVC工作原理

  1. 1. m: model,模型, 数据库操作
  2. 2. v: view, 视图, html 页面
  3. 3. c: controller,控制器, mv 数据交互

index.php(入口文件)

  1. namespace mvc3;
  2. use model\UserModel;
  3. use core\View;
  4. use core\Router;
  5. // 入口文件: 测试
  6. // 1. 类的自动加载器
  7. require __DIR__ . '/core/autoload.php';
  8. // 路由解析
  9. $request = Router::parse();
  10. $controller = array_shift($request);
  11. $method = array_shift($request);
  12. $params = array_shift($request);
  13. // 生成控制器名称
  14. $controller= 'controller\\'. ucfirst($controller). 'Controller';
  15. // 2. 实例化控制器
  16. $model = new UserModel('mysql:dbname=phpedu', 'root', 'root');
  17. $view = new View();
  18. $user = new $controller($model, $view);
  19. // 3. 调用控制器中的方法
  20. call_user_func_array([$user, 'get'], $params);

model: 模型, 数据库操作

  1. // 模型类 Model
  2. // psr-4
  3. namespace core;
  4. use PDO;
  5. abstract class Model
  6. {
  7. protected $db = null;
  8. // 1. 连接数据库
  9. // 在实例化时,自动连接
  10. public function __construct($dsn, $username, $password)
  11. {
  12. $this->db = new PDO($dsn, $username, $password);
  13. }
  14. // 2. 内置一些基本的底层操作,供用户的自定义模型用
  15. // 自定义模型: 与某一张数据表相关的类
  16. // 2.1 获取全部数据
  17. public function select($num)
  18. {
  19. $sql = 'SELECT * FROM `staff` LIMIT ?;';
  20. $stmt = $this->db->prepare($sql);
  21. $stmt->bindParam(1, $num, PDO::PARAM_INT);
  22. $stmt->execute();
  23. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  24. }
  25. // 2.2 获取某个数据( id )
  26. public function getOne($id)
  27. {
  28. $sql = 'SELECT * FROM `user` WHERE `id` = ? ;';
  29. $stmt = $this->db->prepare($sql);
  30. $stmt->bindParam(1, $id, PDO::PARAM_INT);
  31. $stmt->execute();
  32. return $stmt->fetch(PDO::FETCH_ASSOC);
  33. }
  34. }

view, 视图, html 页面

  1. <?php
  2. // 视图类View
  3. namespace core;
  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. // 渲染与传参可以同步完成
  15. public function render(string $path, array $data=[])
  16. {
  17. if ($data) {
  18. foreach ($data as $key=>$value) {
  19. $this->assign($key, $value);
  20. }
  21. }
  22. // 将模板变量数组展开为独立的变量,以方便传入到模板中使用
  23. extract($this->data);
  24. // 渲染/加载模板文件
  25. file_exists($path) ? include $path : die('模板不存在');
  26. }
  27. }

Controller.php 控制器类

  1. // 控制器类View
  2. namespace core;
  3. abstract class Controller
  4. {
  5. // 1. 模型对象
  6. protected Model $model;
  7. // 2. 视图对象
  8. protected View $view;
  9. // 3. 实例化,初始化上面的模型,视图对象
  10. public function __construct(Model $model, View $view)
  11. {
  12. $this->model = $model;
  13. $this->view = $view;
  14. }
  15. }

autoload 自动加载

  1. // 注册类的自动加载器方法
  2. spl_autoload_register(function ($class) {
  3. require str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
  4. });

Router 路由类

  1. namespace core;
  2. // 路由器类
  3. class Router
  4. {
  5. public static function parse(): array
  6. {
  7. // 默认控制器,实际项目,应该来自配置文件,而不是在写死
  8. $controller = 'Index';
  9. $action = 'index';
  10. // 参数列表
  11. $params = [];
  12. // 判断是否存在pathinfo
  13. if (array_key_exists('PATH_INFO', $_SERVER) && $_SERVER['PATH_INFO'] !== '/') {
  14. // 为什么要判断 $_SERVER['PATH_INFO'] !== '/' ?
  15. // 因为: admin.php/ 时,$_SERVER['PATH_INFO'] = '/', 导致解析控制器失败
  16. $pathinfo = array_filter(explode('/', $_SERVER['PATH_INFO']));
  17. // dump($pathinfo);
  18. // 考虑到index.php/ 情况, 这时pathinfo为空数组
  19. if (count($pathinfo) >= 2) {
  20. $controller = array_shift($pathinfo);
  21. $action = array_shift($pathinfo);
  22. $params = $pathinfo;
  23. } else {
  24. $controller = array_shift($pathinfo);
  25. }
  26. }
  27. // 查看控制器,方法,参数
  28. // dump($controller, $action, $params);
  29. // 将这些数据返回出去
  30. return [$controller, $action, $params];
  31. }
  32. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议