一、mvc原理流程图
二、自定义一个mvc
(1)创建配置文件config
// 数据库连接参数
define('DATABASE',[
'type'=>'mysql',
'host'=>'localhost',
'dbname'=>'mydb',
'port'=>'3306',
'charset'=>'utf8',
'username'=>'myshop',
'password'=>'yzj123'
]);
// 应用相关
define('APP', [
// 默认控制器
'default_controller'=>'index',
// 默认方法
'default_action'=>'index'
]);
// 项目根路径
define('ROOT_PATH',__DIR__);
(2)创建核心类库
- Model
namespace phpcn;
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();
// print_r($stmt->debugDumpParams());
return $stmt->fetchAll();
}
}
- View
namespace phpcn;
class View
{
public function display($data)
{
// 1. 模型赋值
$staffs = $data;
// 2. 渲染模型
include ROOT_PATH . '/view/' . 'show.php';
}
}
- Controller
namespace phpcn;
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(5);
// 2. 视图: 渲染模板
$this->view->display($data);
}
}
(3)增加选择控制器功能
- model:StaffModel
namespace phpcn;
// 用户自定义模型
class StaffModel extends Model
{
// 复用
}
- view:show
<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>
- controller:IndexController
namespace phpcn;
// 默认控制器
class IndexController extends Controller
{
// ...
}
- controller:UserController
namespace phpcn;
// 自定义控制器
class UserController extends Controller
{
public function hello()
{
return '<h2>Hello world</h2>';
}
}
(4)url 参数解析
namespace phpcn;
// 加载配置项
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);
// http://phpedu.com/0506/0506/mvc3/index.php?c=controller&a=action
// c=控制器,a=控制器的方法
$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();