1. MVC模式实现数据库查询
- M: Model, 模型, 数据库的操作
- V: View, 视图, 页面, html
- C: Controller, 控制器
- 仿站: V - M - C
- 自主: M - V - C
<?php
// 模型: 当前页面要显示的数据
$pdo = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'melinda123');
$users = $pdo->query('select * from users limit 10')->fetchAll(PDO::FETCH_ASSOC);
?>
<!-- 视图 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户列表</title>
</head>
<body>
<table border="1" width="60%">
<caption>用户表</caption>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
</tr>
<!-- 渲染数据,用横版语法 -->
<?php foreach ($users as $user): ?>
<tr>
<td><?=$user['id']?></td>
<td><?=$user['name']?></td>
<td><?=$user['email']?></td>
</tr>
<?php endforeach ?>
</table>
</body>
</html>
<?php
namespace mvc_demo;
use PDO;
// 模型: 数据库操作
class Model
{
// 获取数据
public function getData()
{
return (new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'melinda123'))
->query('select * from users limit 10')->fetchAll(PDO::FETCH_ASSOC);
}
}
<?php
namespace mvc_demo;
// 视图: 数据展示
class View
{
// 数据展示
public function fetch($data)
{
// 表格方式展示,使用字符串拼接实现table的html代码
$table = '<table>';
$table .= '<caption>用户信息表</caption>';
$table .= '<tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>';
// 遍历用户表
foreach ($data as $user){
$table .= '<tr>';
$table .= '<td>'.$user['id'].'</td>';
$table .= '<td>'.$user['name'].'</td>';
$table .= '<td>'.$user['email'].'</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:yellow;}
td,th {border: 1px solid; padding:5px}
</style>';
<?php
// 控制器1
namespace mvc_demo;
// 加载模型类
require 'Model.php';
// 加载视图类
require 'View.php';
class Controller1
{
// 获取数据,并展示出来
public function index()
{
// 1. 获取数据
// 生成模型
$model = new Model();
// 调用方法
$data = $model->getData();
// 2. 渲染模板
$view = new View();
return $view->fetch($data);
}
}
// 客户端调用(测试)
// 创建控制器实例/对象
$controller = new Controller1();
echo $controller->index();
2. 服务容器
<?php
// 控制器5: Facade门面技术, 静态接管服务容器中的成员的访问
namespace mvc_demo;
use Closure;
// 加载模型类
require 'Model.php';
// 加载视图类
require 'View.php';
// 服务容器
class Container2
{
// 1. 对象容器
protected $instances = [];
// 2. 向对象容器中添加对象
// 参数1: 是外部对象在当前对象容器数组中的键名/别名
// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
public function bind($alias, Closure $process)
{
$this->instances[$alias] = $process;
}
// 3. 从对象容器中取出对象, 调用它
public function make($alias, $params=[] ) {
return call_user_func_array($this->instances[$alias], []);
}
}
// 将外部对象: Model, View的实例绑定到服务容器中
$container = new Container2;
// 绑定模型类实例绑定到服务容器中
$container->bind('model', function(){
return new Model();
});
// 绑定视图类实例绑定到服务容器中
$container->bind('view', function(){
return new View();
});
// 在服务容器与工作的控制器之间再添加一个中间层: Facade
class Facade
{
// 服务容器
protected static $container = null;
// 初始化方法: 就是给当前的Facade类扣$container属性赋值
// 将外部的服务容器注入到当前的facade中
public static function initialize(Container2 $container)
{
// 赋值
static::$container = $container;
}
}
// 模型类成员访问静态化(给成员套一个静态访问的马甲)
class UserModel extends Facade
{
public static function getData()
{
return static::$container->make('model')->getData();
}
}
// 视图类成员访问静态化(给成员套一个静态访问的马甲)
class UserView extends Facade
{
public static function fetch($data)
{
return static::$container->make('view')->fetch($data);
}
}
class Controller5
{
// 构造方法,初始化facade
public function __construct(Container2 $container)
{
// 调用facade的container
Facade::initialize($container);
}
// 用Facade方式类成员
public function index()
{
// 1. 获取数据
$data = UserModel::getData();
// 2. 渲染模板
return UserView::fetch($data);
}
}
// 客户端调用(测试)
$controller = new Controller5($container);
echo $controller->index();
1.服务容器Container2
2.将外部对象: Model, View的实例绑定到服务容器中
3.中间层: Facade
4.外部服务容器注入到当前的facade中
5.视图类成员访问静态化,静态访问马甲UserModel
6.视图类成员访问静态化,静态访问马甲UserView
7.工作控制器Controller5
总结
- 如果依赖的对象非常多,项目中有许多对象和类要不断的调用,那么就需要制作一个容器,全部放进去
- 服务容器作用:将当前类对许多外部对象的依赖, 转为对一个服务容器的依赖,使用服务容器进行了接管
- Facade门面技术: 将对服务容器中的对象的访问进行接管(静态接管)
- 用Facade方式类,获取数据,渲染模板,将页面展示
- 设计模式:依赖注入,服务容器,Facade