PHP的MVC小案例
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
简而言之,
模型Model
– 管理所有数据库相关的逻辑。模型提供了连接和操作数据库的抽象层。
控制器Controller
- 负责所有的业务逻辑,比如 if/else
逻辑。
视图View
– 负责界面显示,如HMTL/XML/JSON显示。
1.Model.php —>模型类:用于数据表的操作
<?php
namespace __1208;
// 模型类:用于数据表的操作
class Model{
public function getData()
{
// 用二维数组来模拟从表中获取到的客户数据
return [
['id'=>1,'name'=>'张珊珊','sex'=>'女','mobile'=>'15888874447','email'=>'594664@qq.com','vip'=>'金冠VIP'],
['id'=>2,'name'=>'李思思','sex'=>'女','mobile'=>'15888874448','email'=>'594455@qq.com','vip'=>'皇冠VIP'],
['id'=>3,'name'=>'马武武','sex'=>'男','mobile'=>'15888874449','email'=>'594888@qq.com','vip'=>'金冠VIP'],
['id'=>4,'name'=>'牛柳柳','sex'=>'女','mobile'=>'15888874455','email'=>'59499@qq.com','vip'=>'金钻VIP'],
['id'=>5,'name'=>'韦彩泥','sex'=>'女','mobile'=>'15888874466','email'=>'59406@qq.com','vip'=>'普通VIP'],
];
}
}
2.View.php —>视图类:渲染数据
<?php
namespace __1208;
// 视图类:渲染数据
class View{
public function fetch($data){
$table = '<table>';
$table .= '<caption>客户信息表</caption>';
$table .= '<tr><th>ID</th><th>姓名</th><th>性别</th><th>联系方式</th><th>邮箱</th><th>会员等级</th></tr>';
foreach ($data as $news) {
$table .= '<tr>';
$table .= '<td>' . $news['id'] . '</td>';
$table .= '<td>' . $news['name'] . '</td>';
$table .= '<td>' . $news['sex'] . '</td>';
$table .= '<td>' . $news['mobile'] . '</td>';
$table .= '<td>' . $news['email'] . '</td>';
$table .= '<td>' . $news['vip'] . '</td>';
$table .= '</tr>';
}
$table .= '</table>';
return $table;
}
}
echo '<style>
table {border-collapse: collapse; border: 1px solid; width: 600px;height: 200px}
caption {font-size: 1.2rem; margin-bottom: 10px;}
tr:first-of-type { background-color:#dac9e6;}
td,th {border: 1px solid}
td:first-of-type {text-align: center;}
</style>';
3.Controller.php —>控制器: 将客户信息表展示出来
<?php
// 控制器: 将客户信息表展示出来
namespace __1208;
// 1. 加载模型
require 'Model.php';
// 2. 加载视图
require 'View.php';
//添加服务容器层
class Container{
// 容器属性, 就是一个数组,里面全是创建对象的方法
protected $instance = [];
// 1. 放进去: 将类的实例化过程绑定到容器中 $alias: 类实例的别名,
public function bind($alias, \Closure $process){
// 将类实例化的方法绑定/ 存储到服务容器中
$this->instance[$alias] = $process;
}
// 2. 取出来: 执行容器中的实例方法
public function make($alias, $params=[]){
return call_user_func_array($this->instance[$alias], []);
}
}
// 实例化容器
$container = new Container();
// 用到模型对象, 视图对象,将它们绑定到容器中
$container->bind('model', function () {return new Model();});
$container->bind('view', function () {return new View();});
// Facade技术: 规范/统一了对外部对象的调用方式, 全部改为了静态调用, 不管之前的方法是什么类型
// 添加Facade门面类
class Facade{
protected static $container = null;
protected static $data = [];
// 用服务容器给它初始化
public static function initialize(Container $container){
static::$container = $container;
}
// 用静态代理方式将模型中的getData()静态化
public static function getData(){
static::$data = static::$container->make('model')->getData();
}
// 用静态代理方式将视图中的fetch()静态化
public static function fetch(){
return static::$container->make('view')->fetch(static::$data);
}
}
class Student extends Facade{
//...
}
// 3. 创建控制器
class Controller{
public function __construct(Container $container){
// 调用Facade里面的初始化方法
Student::initialize($container);
}
public function index(){
// 3.1 获取数据
Student::getData();
// 3.2 渲染模板
return Student::fetch();
}
}
// 4. 客户端调用/访问类成员 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
$controller = new Controller($container);
echo $controller->index();