php开发简易的mvc框架
mvc工作原理
Model:模型类,数据库操作
View:视图类,展示到客户端
Controller:控制器,协调模型与视图
基本架构如下
实际开发效果演示效果
基本框架目录解构
通过入口文件index.php来处理打开对应页面
index.php
<?php
// 带路由解析功能的框架的入口文件
namespace mvc3;
use controller\UserController;
use core\Router;
use model\UserModel;
use core\View;
// 1. 类的自动加载器
require __DIR__ . '/core/autoload.php';
$model = new UserModel('mysql:dbname=phpedu', 'root', 'root');
$view = new View();
// 2. 路由解析
$request = Router::parse();
// echo '<pre>'. print_r($request, true) . '</pre>';
// 2. 实例化控制器
$controller = array_shift($request);
$method = array_shift($request);
$params = array_shift($request);
$controller = 'controller\\'.ucfirst($controller) . 'Controller';
$user = new $controller($model, $view);
// 3. 执行控制器默认方法
call_user_func_array([$user,$method], $params);
Model:模型类,数据库操作(core文件夹)
<?php
namespace core;
use PDO;
// 模型类
// 抽象类, 必须通过子类才可访问
abstract class Model
{
// 1. 连接对象
protected $db = null;
// 2. 实例化时自动连接数据库
public function __construct($dsn, $username, $password)
{
$this->db = new PDO($dsn, $username, $password);
}
// 3. 内置常用操作
// 如select : 获取所有数据列表,默认10条
public function select($num =10)
{
$stmt = $this->db->prepare('SELECT * FROM `user` LIMIT ?');
$stmt->bindParam(1, $num, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 某取单条记录
public function getOne($id)
{
$sql = 'SELECT * FROM `user` WHERE `id` = ?';
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $id, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
View:视图类,展示到客户端(core文件夹)
<?php
namespace core;
// 视图类
class View
{
// 1. 模板变量容器
protected array $data = [];
// 2. 模板赋值
public function assign(string $key, $value)
{
$this->data[$key] = $value;
}
// 3. 模板渲染
public function render(string $path, array $data = [])
{
// 支持模型赋值与模板渲染同步进行
// 如果传入了第二个参数,模板变量,则先执行赋值
if ($data) {
foreach ($data as $key=>$value) {
// 调用本类的assign()
$this->assign($key, $value);
}
}
// 将模板变量解析到当前作用域中
extract($this->data);
// 加载模板
file_exists($path) ? include $path : die('模板不存在');
}
}
Controller:控制器,协调模型与视图
<?php
namespace core;(core文件夹)
// 抽象类, 必须通过子类才可访问
abstract class Controller
{
// 1. 模型对象
protected $model;
// 2. 视图对象
protected $view;
// 3. 实例化,初始化模型与视图对象
public function __construct($model, $view)
{
$this->model = $model;
$this->view = $view;
}
}
用户开发页面在controller,model,view这三个文件里面进行写对应的方法,模型,视图操作
controller (UserController.php)
<?php
// 用户管理控制器
namespace controller;
use core\Controller;
// 继承控制器基类
class UserController extends Controller
{
public function __construct($model, $view)
{
parent::__construct($model, $view);
}
// 获取指定id的用户信息
public function get($id)
{
// 1. 模型: 获取数据
$user = $this->model->get($id);
// 2. 视图: 渲染模板
$this->view->render('view/user/get.php', ['user'=>$user]);
}
public function select($num){
// 1. 模型: 获取数据
$users = $this->model->getSelect($num);
// 2. 视图: 渲染模板
$this->view->render('view/user/select.php', ['users'=>$users]);
}
}
model (UserModel.php)
<?php
// 自定义模型类: 用户表user操作
namespace model;
use core\Model;
// 继承模型基类
class UserModel extends Model
{
public function __construct($dsn, $usename, $password)
{
parent::__construct($dsn, $usename, $password);
}
// 获取某个数据
public function get($id)
{
// 调用基类的getOne($id)
return $this->getOne($id);
}
//获取10条数据
public function getSelect($num){
return $this->select($num);
}
}
view (select.php)
<!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>
<h3>员工列表</h3>
<ul>
<?php foreach ($users as $staff) : extract($staff) ?>
<li><?=$id?> : <?=$name?>, <?=$age?> (
<?=$email?> )
</li>
<?php endforeach ?>
</ul>
</body>
</html>
view (get.php)
<!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>Document</title>
</head>
<body>
<ul>
<?php foreach ($user as $key => $value) : ?>
<li>[ <?=$key?> ] => <?=$value?></li>
<?php endforeach ?>
</ul>
</body>
</html>
最终输出效果