Blogger Information
Blog 20
fans 0
comment 0
visits 8142
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php开发简易的mvc框架
P粉191340380
Original
440 people have browsed it

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. }
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
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