创建配置文件 config.php
配置文件应该是第一个被加载的文件
config.php代码
<?php
//数据库连接文件
define('DATABASE', [
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'phpedu',
'port' => '3306',
'charset' => 'utf8',
'username' => 'root',
'password' => 'root'
]);
//应用相关
define('APP', [
//默认控制器
'default_controller' => 'index',
//默认方法
'default_action' => 'index'
]);
//项目根路径
define('ROOT_PATH', __DIR__);
创建核心类库MVC
创建框架核心类库 core 目录,将 mvc 类放进去,方便统一管理和更新
控制器类文件Controller.php代码
<?php
namespace phpedu;
class Controller
{
// 模型对象
protected $model;
// 视图对象
protected $view;
// 控制器类实例时,要确保模型和视图对象可用
public function __construct($model,$view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
// 1. 模型: 获取数据
$data = $this->model->getAll(10);
// 2. 视图: 渲染模板
$this->view->display($data);
}
}
?>
模型类文件Model.php代码
<?php
namespace phpedu;
use PDO;
class Model
{
// 数据对象
protected $db;
// 模型实例化时,应该将数据库连接上,为后面的操作做好准备
public function __construct($dsn,$username,$password)
{
$this->db = new PDO($dsn,$username,$password);
}
// 通常模型类中,会预置一些公共方法,供用户进行数据库操作
public function getAll($n = 10)
{
$stmt = $this->db->prepare('SELECT * FROM `staff` LIMIT ?');
$stmt->bindParam(1, $n, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll();
}
}
?>
渲染视图类文件View.php代码
<?php
namespace phpedu;
class View
{
public function display($data)
{
// 1. 模型赋值
$staffs = $data;
// 2. 渲染模型
include ROOT_PATH . '/view/' .'show.php';
}
}
?>
自定义默认控制器类模型
自定义控制器和模型和视图类,继承自核心类库中的对应类
IndexController.php 代码
<?php
namespace phpedu;
// 默认控制器
class IndexController extends Controller
{
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工管理系统</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="5" width="400">
<caption style="font-size: 1.2em;">员工信息表</caption>
<thead bgcolor="lightcyan">
<tr>
<th>id</th>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>操作</th>
</tr>
</thead>
<tbody align="center">
<?php foreach ($staffs as [$id, $name, $sex, $email]) : ?>
<tr>
<td><?= $id ?></td>
<td><?= $name ?></td>
<td><?= $sex ? '女' : '男' ?></td>
<td><?= $email ?></td>
<td>
<a href="">编辑</a>
<a href="">删除</a>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</body>
</html>
入口文件index.php 代码
<?php
namespace phpedu;
// 加载配置项
require __DIR__ . '/config.php';
// 加载框架的核心类型
require __DIR__ . '/core/Controller.php';
require __DIR__ . '/core/Model.php';
require __DIR__ . '/core/View.php';
// 加载自定义模型
require __DIR__ . '/model/StaffModel.php';
// 将关联数组解构成一一个独立变量
extract(DATABASE);
$dsn = sprintf('%s:dbname=%s', $type, $dbname);
$model = new StaffModel($dsn, $username, $password);
// c=控制器, a=控制器的方法 ?c=controller&a=action
$c = $GET['c'] ?? APP['default_controller'];
$a = $GET['a'] ?? APP['default_action'];
// 获取类名
$class = ucfirst($c) . 'Controller';
// 加载自定义控制器类
require __DIR__ . '/controller/' . $class . '.php';
// 加载视图类
$view = new VIew();
// 完整控制器类名
$fullclass = __NAMESPACE__ . '\\' . $class;
$controller = new $fullclass($model,$view);
// 执行控制器中的index()方法
echo $controller->$a();
?>