Blogger Information
Blog 62
fans 3
comment 1
visits 29902
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php开发简易的mvc框架流程代码演示
kiraseo_wwwkiraercom
Original
426 people have browsed it

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方法时输出结果

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