关键词搜索

源码搜索 ×
×

《php从零开始开发属于自己的php框架》课程笔记5——将项目改造成实用框架

发布2021-01-27浏览433次

详情内容

项目改造及优化。

1.新建项目,命名为mvc1,项目结构如下:

在这里插入图片描述
目录简述:

  • application目录中主要是前台、后台模块及配置文件(home对应前台、admin对应后台);
  • framework才是真正的框架目录,内置数据库操作类和一些公共模型;
  • config目录用于放置用户的自定义配置文件。

2.项目整理。

  • 将Db.php和Model.php复制到framework目录下;
  • 将StudentModel.php复制到application/home/model文件夹;
  • 将StudentController.php复制到application/home/controller文件夹;
  • 将student_info.php和student_list.php复制到application/home/view目录下;

3.创建应用的公共配置文件

修改StudentController.php。为方便自动加载,在方法名后加Action作为后缀,同时修改视图模板路径。

    /**
     * 获取所有数据
     * @return mixed
     */
    public function listAllAction()
    {
        // 实例化模型,获取数据
        $stu = new StudentModel();
        $data = $stu->getAll();
        require_once './application/home/view/student_list.php'; // 渲染模板
    }

    /**
     * 获取单条数据
     * @return mixed
     */
    public function infoAction($id=1)
    {
        $id = isset($_GET['id']) ? $_GET['id'] : $id;
        // 实例化模型,获取数据
        $stu = new StudentModel();
        $data = $stu->get($id);
        require_once './application/home/view/student_info.php'; // 渲染模板
    }

    在config目录下新建config.php,作为公共配置文件。

    config.php:

    <?php
    /**
     * 应用配置文件
     * 使用数组方式
     */
    return [
      // 数据库连接参数配置
      'db' => [
          'user' => 'root', // 用户名
          'pass' => '123456', // 密码
          'dbname' => 'edu', // 默认数据库名称
      ],
        // 应用的整体配置
        'app' => [
            'default_platform' => 'home', // 默认模块
        ],
    
        // 前台配置
        'home' => [
            'default_controller' => 'Student', // 默认控制器
            'default_action' => 'listAll', // 默认方法
        ],
    
        // 后台配置
        'admin' => [
            'default_controller' => '', // 默认控制器
            'default_action' => '', // 默认方法
        ],
    ];
    
      25
    • 26
    • 27
    • 28
    • 29

    4.创建框架基础类

    在framework文件夹下创建Base.php。主要实现读取配置、自动加载类和请求分发的功能。

    Base.php:

    <?php
    /**
     * 框架基础类,引导类,前端控制器
     * 主要完成三个功能:
     * 1.读取配置
     * 2.自动加载类
     * 3.请求分发
     */
    
    class Base
    {
        // 创建run方法,完成框架的所有功能
        public function run()
        {
            // 加载配置
            $this->loadConfig();
            // 注册自动加载
            $this->registerAutoLoad();
            // 获取请求参数
            $this->getRequestParams();
            // 请求分发
            $this->dispatch();
        }
    
        // 加载配置
        private function loadConfig()
        {
            // 使用全局变量保存用户配置
            $GLOBALS['config'] = require './application/config/config.php';
        }
    
        // 创建用户自定义类的加载方法
        public function userAutoLoad($className)
        {
            // 定义基本类的列表
            $baseClass = [
              'Model' => './framework/Model.php',
              'Db' => './framework/Db.php',
            ];
    
            // 依次进行判断:基础类?模型类?控制器类?
            if (isset($baseClass[$className])) {
                require $baseClass[$className]; // 加载模型基类
            } elseif (substr($className, -5) == 'Model') {
                require './application/home/model/'.$className.'.php'; // 加载自定义模型基类
            } elseif (substr($className, -10) == 'Controller') {
                require './application/home/controller/'.$className.'.php'; // 加载自定义控制器基类
            }
        }
        // 注册自动加载方法
        private function registerAutoLoad()
        {
            spl_autoload_register([$this, 'userAutoLoad']);
        }
    
        // 获取请求参数
        private function getRequestParams()
        {
            // 当前模块
            $defPlate = $GLOBALS['config']['app']['default_platform'];
            $p = isset($_GET['p']) ? $_GET['p'] : $defPlate;
            define('PLATFORM', $p);
    
            // 当前控制器
            $defController = $GLOBALS['config'][PLATFORM]['default_controller'];
            $c = isset($_GET['c']) ? $_GET['c'] : $defController;
            define('CONTROLLER', $c);
    
            // 当前方法
            $defAction = $GLOBALS['config'][PLATFORM]['default_action'];
            $a = isset($_GET['a']) ? $_GET['a'] : $defAction;
            define('ACTION', $a);
        }
    
        // 请求分发
        private function dispatch()
        {
            // 实例化控制器类
            $controllerName = CONTROLLER.'Controller';
            $controller = new $controllerName;
    
            // 调用当前方法
            $actionName = ACTION.'Action';
            $controller->$actionName();
        }
    }
    
      25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    5.创建框架入口文件

    在根目录下创建入口文件index.php。
    index.php:

    <?php
    /**
     * 入口文件
     */
    
    // 导入框架基础类
    require './framework/Base.php';
    
    // 实例化框架类
    $app = new Base();
    
    // 让框架跑起来
    $app->run();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    改造后的项目结构如下:
    在这里插入图片描述

    6.项目运行测试

    查询所有数据:http://localhost/php.cn/mvc1/
    在这里插入图片描述

    查询单条记录:http://localhost/php.cn/mvc1/?p=home&a=info&id=6
    在这里插入图片描述


    往期文章

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载