批改状态:合格
老师批语:
这里算详解了MVC架构的构建思路,mvc通称模型视图控制器,但是详解后一般为模型,视图,控制器,容器门面,他们的相应关系是模型是后端接收视图层的命令,控制器为模型跟视图层的交换数据,而容器呢,是将控制器中的方法盛放到容器中,让方法稳定一下来,而门面呢,是进一步将容器中的方法静态化,方便更好的调佣,
画了一个流程图:
贴全部代码:
模型文件:
<?phpnamespace chloe\app;use pdo;class Model{public function getData(){return (new PDO('mysql:host=localhost;charset=utf8;dbname=phpcn', 'root', '123456', [PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING]))->query('SELECT `cou_id`,`title`,`pic`,`info`,`add_time`FROM `mj_course_lists` ORDER BY `cou_id` DESC LIMIT 6')->fetchAll();}public function editData(){}}// 模型文件// 获取模型数据// var_dump((new Model)->getData());
视图文件:
<?phpnamespace chloe\app;// require 'Model.php';class View{public function fetch($data){// .= shi 组合相加$table = '<table border="1" cellspacing="0" cellpadding="5" align="center">';$table .= '<caption>课程信息表</caption>';$table .= '<tr align="center"><td>编号</td><td>名称</td><td>封面</td><td>课程简介</td><td>创建时间</td><td>操作</td></tr>';foreach ($data as $list) {// foreach遍历data的数据$table .= '<tr>';$table .= '<td>' . $list['cou_id'] . '</td>';$table .= '<td>' . $list['title'] . '</td>';$table .= "<td><img style='width:100px' src='{$list['pic']}' alt='课程封面' ></td>";$table .= '<td>' . $list['info'] . '</td>';$table .= '<td>' . date("Y-m-d H:m:s", $list['add_time']) . '</td>';$table .= '<td><button>删除</button> <button>编辑</button> </td>';$table .= '</tr>';}$table .= '</table>';return $table;}}// $data = (new Model)->getData();// echo (new View)->fetch($data);
控制器文件:
控制器文件是视图层跟模型层的数据交换层:
<?phpnamespace chloe\app;// 类的自动加载require __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';// 控制器引入静态模型跟静态视图模型use chloe\facade\Facade;use chloe\facade\FacadeModel;use chloe\facade\FacadeView;class Controller3{public function __construct($container){// 这里是第四版,第三版是将注入方法放到了构造器中,而第四版也是放到了构造器中,但是是一个静态调用方法// 容器的初始化赋值操作 将门面中的方法传值 调用Facade类里面的静态方法 传入值Facade::initialize($container);}public function index(){//获取数据// 传入值后调用容器中的make方法 也就是将实例化的new Model当做一个别名model$data = FacadeModel::getData();//渲染数据return FacadeView::fetch($data);}}// 客户端代码$container = new Container;// bind()方法中传入一个model值是实例化的 new model// 上面先实例化,实例化后再下面绑定到bind方法的数组中 也就是绑定的model类跟view类$container->bind('model', function () {return new Model;});$container->bind('view', function () {return new View;});// 上面将model跟view实例绑定到$container容器中,也就是传入到值的方法中$c3 = new Controller3($container);echo $c3->index();
容器层:
将视图层的方法统一放到容器中管理:
<?php/**** 如果当前类锁依赖的外部对象过多,名称很长,将依赖的所有外部对象放到一个容器中进行统一管理。并且可以起名****/namespace chloe\app;use Closure;//将容器里面的对象放到一个数组中,用于存放外部依赖的多个对象,把容器当做一个数组,数组的下键就是别名,值就是外部对象,依赖的对象//服务容器 一个产生对象的工厂 自动生产类,对象的工厂class Container{//对象容器protected $instances = [];/*** 绑定一个类标识、闭包、实例到容器* @access public* @param string|array $abstract 类标识或者接口的别名 alias* @param mixed $concrete 要绑定的类、闭包或者实例**///往容器数组中绑定对象 $concrete是绑定的闭包 Closure闭包public function bind($abstract, Closure $concrete) //第一个参数是别名 第二个参数,是具体绑定的对象{// 将值赋值给数组, $abstract是数组的键, $concrete是数组的值$this->instances[$abstract] = $concrete;}//下面是取值public function make($abstract, $params = []){// 刚刚在上面绑定了一个闭包函数方法,已经将闭包函数方法赋值给了 $instances// 第二个是传入的参数return call_user_func_array($this->instances[$abstract], $params);}}
门面:
下面的门面是写一个静态化方法,赋值给静态化属性,将方法赋值给静态化属性,也就是将模型层跟视图层静态化
<?phpnamespace chloe\facade;//引入容器use chloe\app\Container;// 类的自动加载require __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';// facade 门面是为容器中的动态类 提供一个静态调用接口,相比于传统的静态方法调用,带来更好的可测试性和扩展性,facade就是服务容器// 和控制器之间加一个中间层//引入容器//将容器方法静态化class Facade{//为容器中动态类提供静态调用接口// 在门面中将容器的方法静态化处理protected static $container;// 接收容器 return的值也就是一个数组public static function initialize(Container $container){ //门面将属性方法静态化 也就是将数组静态化调用static::$container = $container;}}
进一步将模型层静态化:
<?phpnamespace chloe\facade;class FacadeModel extends Facade{//模型类成员方法 getData()的访问静态化public static function getData(){//使用门面静态方法链式调用 方法为getData make是继承过来的 Facade类中继承过来的chloe\app\Container方法return static::$container->make('model')->getData();}}
进一步将视图层静态化:
<?phpnamespace chloe\facade;class FacadeView extends Facade{public static function fetch($data){// 利用门面将容器中的方法静态化处理 方法为fetch fetch是继承过来的 Facade类中继承过来的chloe\app\Container类中的fetch方法return static::$container->make('view')->fetch($data);}}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号