编写迷你版MVC小框架具体步骤以及心得体会

框架目录结构:

  • app: 应用目录
    • controllers: 控制器目录
    • models: 模型目录
    • views: 视图目录
  • core: 核心目录
  • vendor: Composer类库目录
  • composer.json: Composer 定义文件

具体步骤如下:

1. 使用第三方包下载

  1. Model: composer require catfan/medoo 得到一个 vendor/catfan/medoo文件
  2. View: composer require league/plates 得到一个 vendor/league/plates文件

2. 打开配置文件composer.json

样式代码:

  1. {
  2. "name": "zhu/php.cn",
  3. "description": "this is a test",
  4. "require": {
  5. "catfan/medoo": "^1.7",
  6. "league/plates": "^3.4"
  7. },
  8. "autoload": {
  9. "psr-4": {
  10. "models\\": "app/models",
  11. "views\\": "app/views",
  12. "controllers\\": "app/controllers",
  13. "core\\": "core"
  14. }
  15. }
  16. }

3.新建core核心目录并在其下新建模型: Model 和视图: View 两个文件

Model.php样式代码:

  1. <?php
  2. // 模型类
  3. namespace core;
  4. use Medoo\Medoo;
  5. class Model extends Medoo
  6. {
  7. public function __construct()
  8. {
  9. parent::__construct([
  10. 'database_type' => 'mysql',
  11. 'database_name' => 'phpedu',
  12. 'server' => 'localhost',
  13. 'username' => 'root',
  14. 'password' => 'root',
  15. ]);
  16. }
  17. public function first()
  18. {
  19. // 自定义方法
  20. }
  21. }

View.php样式代码:

  1. <?php
  2. namespace core;
  3. use League\Plates\Engine;
  4. class View extends Engine
  5. {
  6. public $templates;
  7. public function __construct($path)
  8. {
  9. $templates = parent::__construct($path);
  10. }
  11. }

4. 在app目录下新建controllers models views 三个目录

4.1 在controllers目录下新建StaffsController.php文件,用来获取用户数据赋值给模板

StaffsController.php样式代码:

  1. <?php
  2. namespace controllers;
  3. class StaffsController
  4. {
  5. public $model;
  6. public $view;
  7. public function __construct($model, $view)
  8. {
  9. $this->model = $model;
  10. $this->view = $view;
  11. }
  12. public function index()
  13. {
  14. return __METHOD__;
  15. }
  16. public function select()
  17. {
  18. // 获取数据
  19. $staffs = $this->model->select('staffs', ['id', 'name', 'gender', 'salary', 'email'], ['salary[>=]' => 6000, 'LIMIT' => 6]);
  20. // 模板赋值
  21. return $this->view->render('staffs/list', ['staffs' => $staffs]);
  22. }
  23. }

4.2 在Models目录下新建StaffsModel.php文件,用来获取表数据

StaffsModel.php样式代码:

  1. <?php
  2. namespace models;
  3. use core\Model;
  4. // 自定义模型类通常与一张数据表绑定,继承自框架核心模型类
  5. class StaffsModel extends Model
  6. {
  7. public function __construct()
  8. {
  9. parent::__construct();
  10. }
  11. }

4.3 在Views目录下新建一个staffs文件夹,在该文件夹下面新建list.php文件

list.php样式代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>员工信息</title>
  7. <style>
  8. body {
  9. display: flex;
  10. flex-direction: column;
  11. align-items: center;
  12. }
  13. table {
  14. border-collapse: collapse;
  15. border: 1px solid;
  16. width: 50%;
  17. text-align: center;
  18. }
  19. th,
  20. td {
  21. border: 1px solid;
  22. padding: 5px;
  23. }
  24. tr:first-child {
  25. background-color: #0ff;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <h3>用户管理系统</h3>
  31. <table>
  32. <tr>
  33. <th>id</th>
  34. <th>姓名</th>
  35. <th>性别</th>
  36. <th>工资</th>
  37. <th>邮箱</th>
  38. <th>操作</th>
  39. </tr>
  40. <?php foreach ($staffs as $uname): ?>
  41. <tr>
  42. <td><?=$this->e($uname['id'])?></td>
  43. <td><?=$this->e($uname['name'])?></td>
  44. <td><?=$this->e($uname['gender']) == 'male' ? '男' : '女'?></td>
  45. <td><?=$this->e($uname['salary'])?></td>
  46. <td><?=$this->e($uname['email'])?></td>
  47. <td><button>编辑</button>&nbsp;<button>删除</button></td>
  48. </tr>
  49. <?php endforeach ?>
  50. </table>
  51. <p>
  52. <a href="">1</a>
  53. <a href="">2</a>
  54. <a href="">3</a>
  55. <a href="">4</a>
  56. <a href="">5</a>
  57. <a href="">6</a>
  58. </p>
  59. </body>
  60. </html>

5. composer.json 将控件映射到目录

composer.json样式代码: 完成后开启终端输入 composer dump 更新自动加载

  1. {
  2. "name": "zhu/php.cn",
  3. "description": "this is a test",
  4. "require": {
  5. "catfan/medoo": "^1.7",
  6. "league/plates": "^3.4"
  7. },
  8. "autoload": {
  9. "psr-4": {
  10. "models\\": "app/models",
  11. "views\\": "app/views",
  12. "controllers\\": "app/controllers",
  13. "core\\": "core"
  14. }
  15. }
  16. }

6. index.php 入口文件

  1. <?php
  2. // 入口文件
  3. use models\StaffsModel;
  4. use controllers\StaffsController;
  5. use core\View;
  6. require __DIR__ . '/vendor/autoload.php';
  7. // 测试模型
  8. $model = new StaffsModel();
  9. // 测试视图
  10. $view = new View('app/views');
  11. // 测试控制器
  12. $controller = new StaffsController($model,$view);
  13. print_r($controller->select());

运行效果预览:

总结:

  1. 第一步先安装配置好 composer 下载地址: https://pkg.phpcomposer.com/
  2. 第二步找到composer所需的第三方包依赖进行快速搭建模型Model与视图View
  3. 第三步 创建一个核心目录文件夹
  4. 第四步 创建app目录,搭建起MVC架构
  5. 第五步 配置好composer.js文件,用来映射目录文件
  6. index.php 是入口文件得注意use导入名称信息