项目改造及优化。
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' => '', // 默认方法
],
];
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();
}
}
5.创建框架入口文件
在根目录下创建入口文件index.php。
index.php:
<?php
/**
* 入口文件
*/
// 导入框架基础类
require './framework/Base.php';
// 实例化框架类
$app = new Base();
// 让框架跑起来
$app->run();
改造后的项目结构如下:
6.项目运行测试
查询所有数据:http://localhost/php.cn/mvc1/
查询单条记录:http://localhost/php.cn/mvc1/?p=home&a=info&id=6