博客列表 >MVC原理实现+PHP服务容器+Facade门面技术,对象管理,技术干货!

MVC原理实现+PHP服务容器+Facade门面技术,对象管理,技术干货!

张福根一修品牌运营
张福根一修品牌运营原创
2020年12月18日 15:07:00798浏览

MVC原理与container, facade设计模式

MVC模式
一、MVC是一种架构模式,M-模型/V-视图/C-控制器

  • 模型(Model):负责存储系统的中心数据。
  • 视图(View):将信息显示给用户(可以定义多个视图)。
  • 控制器(Controller):处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。

1、MVC实例展示:

实例效果:

MVC实例

实例源码:

  1. <?
  2. //模型层:当前页面要显示的数据
  3. $pdo = new PDO('mysql:host=localhost;dbname=study','root','123456');
  4. $orders = $pdo->query('SELECT `id`,`name`,`pro`,`price` FROM `order` order by id asc LIMIT 8')->fetchAll(PDO::FETCH_ASSOC);
  5. // print_r($orders);
  6. ?>
  7. <!-- 视图层 -->
  8. <!DOCTYPE html>
  9. <html lang="en">
  10. <head>
  11. <meta charset="UTF-8">
  12. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  13. <title>订单数据显示</title>
  14. <link rel="stylesheet" href="style.css">
  15. </head>
  16. <body>
  17. <table width="100%" border="1" cellspacing="0" cellpadding="5">
  18. <caption>用户信息表</caption>
  19. <thead>
  20. <tr>
  21. <td>编号</td>
  22. <td>姓名</td>
  23. <td>项目</td>
  24. <td>价格</td>
  25. <td>操作</td>
  26. </tr>
  27. </thead>
  28. <tbody>
  29. <?php foreach($orders as $order):?>
  30. <tr>
  31. <td><?= $order['id']?></td>
  32. <td><?= $order['name']?></td>
  33. <td><?= $order['pro']?></td>
  34. <td><?= $order['price']?></td>
  35. <td><button>删除</button><button>编辑</button></td>
  36. </tr>
  37. <?php endforeach;?>
  38. </tbody>
  39. </table>
  40. </body>
  41. </html>



二、公共模型和视图类:

1、Model.php

  1. <?php
  2. namespace zhangfugen;
  3. use PDO;
  4. class Model {
  5. //获取数据
  6. public function getData()
  7. {
  8. return (new PDO('mysql:host=localhost;dbname=study','root','123456'))->query('SELECT `id`,`name`,`pro`,`price` FROM `order` order by id DESC LIMIT 10')->fetchAll(PDO::FETCH_ASSOC);
  9. }
  10. }

2、View.php

  1. <?php
  2. namespace zhangfugen;
  3. //视图 : 数据展示
  4. class View {
  5. public function fetch($data){
  6. $table = '<table>';
  7. $table.= ' <caption>订单信息表</caption>';
  8. $table.= '<tr><th>编号</th><th>名称</th><th>项目</th><th>价格</th></tr>';
  9. foreach($data as $user){
  10. $table.= '<tr>';
  11. $table.=' <td>'.$user['id'].'</td>';
  12. $table.=' <td>'.$user['name'].'</td>';
  13. $table.=' <td>'.$user['pro'].'</td>';
  14. $table.=' <td>'.$user['price'].'</td>';
  15. $table.= '</tr>';
  16. }
  17. $table .= '</table>';
  18. return $table;
  19. }
  20. }
  21. echo '<style>
  22. table {border-collapse: collapse; border: 1px solid;text-align: center; height: 480px;width: 780px;}
  23. caption {font-size: 2rem; margin: 20px 0px;}
  24. tr:first-of-type { background-color:lightgreen;}
  25. td,th {border: 1px solid; padding:5px}
  26. </style>';

三、参数注入在MVC原理应用:

参数注入在MVC原理应用

  1. <?php
  2. // 参数注入在MVC原理应用:
  3. namespace zhangfugen;
  4. //加载模型 视图类
  5. require 'Model.php';
  6. require 'View.php';
  7. class Controller{
  8. public function index($model,$view)
  9. {
  10. //1. 获取数据
  11. $data = $model->getData();
  12. //2.模板渲染
  13. return $view->fetch($data);
  14. }
  15. public function edit($model){
  16. }
  17. }
  18. $contr = new Controller;
  19. $model = new Model();
  20. $view = new View();
  21. echo $contr->index($model,$view);

四、实现外部对象在当前类中的共享(复用):

通过构造方法:

  1. <?php
  2. // 通过构造方法将实现外部对象在当前类中的共享(复用):
  3. namespace zhangfugen;
  4. //加载模型 视图类
  5. require 'Model.php';
  6. require 'View.php';
  7. class Controller {
  8. private $model;
  9. private $view;
  10. // 通过构造方法将外部对象初始化,实现了外部依赖注入的对象在类内部的共享/复用
  11. public function __construct($model,$view){
  12. $this->model = $model;
  13. $this->view = $view;
  14. }
  15. public function index(){
  16. //1. 获取数据
  17. $data = $this->model->getData();
  18. //2.模板渲染
  19. return $this->view->fetch($data);
  20. }
  21. public function edit(){
  22. }
  23. public function uqdate(){
  24. }
  25. }
  26. // 实例化类:
  27. $model = new Model();
  28. $view = new View();
  29. // 外部对象的注入点放在了魔术方法
  30. $contr = new Controller($model,$view);
  31. echo $contr->index();

将外部对象放到一个”服务容器”中进行统一管理:

服务容器Container

服务容器

  1. <?php
  2. // 将外部对象放到一个"服务容器"中进行统一管理
  3. // 服务容器Container
  4. namespace zhangfugen;
  5. //引用基类Closure,是用于代表匿名函数的类
  6. use Closure;
  7. //加载模型 视图类
  8. require 'Model.php';
  9. require 'View.php';
  10. // 服务容器: 一个自动产生类/对像的工厂
  11. class Container {
  12. //1. 定义对象容器:
  13. protected $instances = [];
  14. // 2. 对象容器中添加对象
  15. // $abstract 类标识,当前容器数组中的键名/别名
  16. // $concrete 要绑定的类, 闭包或者实例,实现方法
  17. public function bind($abstract, Closure $concrete)
  18. {
  19. $this->instances[$abstract] = $concrete;
  20. }
  21. // 3.从对象容器中取出对象, 调用
  22. public function make($abstract,$params=[])
  23. {
  24. return call_user_func_array($this->instances[$abstract],$params);
  25. }
  26. }
  27. $container = new Container;
  28. // 将外部对象: Model, View的实例绑定到服务容器中
  29. $container->bind('model',function(){
  30. return new Model();
  31. });
  32. $container->bind('view',function(){
  33. return new View();
  34. });
  35. class Controller {
  36. // 控制器获取数据,并展示出来
  37. public function index(Container $container){
  38. //1. 获取数据
  39. $data = $container->make('model')->getData();
  40. //2.模板渲染
  41. return $container->make('view')->fetch($data);
  42. }
  43. }
  44. // 实例化输出
  45. $contr = new Controller();
  46. echo $contr->index($container);

Facade门面技术静态接管服务容器中对象的访问:

Facade门面技术

  1. <?php
  2. // Facade门面技术静态接管服务容器中对象的访问
  3. namespace zhangfugen;
  4. //引用基类Closure,是用于代表匿名函数的类
  5. use Closure;
  6. //加载模型 视图类
  7. require 'Model.php';
  8. require 'View.php';
  9. // <=========================================================================>
  10. // 服务容器: 一个自动产生类/对像的工厂
  11. // 将外部对象放到一个"服务容器"中进行统一管理
  12. class Container {
  13. //1. 定义对象容器:
  14. protected $instances = [];
  15. // 2. 对象容器中添加对象
  16. // $abstract 类标识,当前容器数组中的键名/别名
  17. // $concrete 要绑定的类, 闭包或者实例,实现方法
  18. public function bind($abstract, Closure $concrete)
  19. {
  20. $this->instances[$abstract] = $concrete;
  21. }
  22. // 3.从对象容器中取出对象, 调用
  23. public function make($abstract,$params=[])
  24. {
  25. return call_user_func_array($this->instances[$abstract],$params);
  26. }
  27. }
  28. $container = new Container;
  29. // 将外部对象: Model, View的实例绑定到服务容器中
  30. $container->bind('model',function(){
  31. return new Model();
  32. });
  33. $container->bind('view',function(){
  34. return new View();
  35. });
  36. // <==========================================================================>
  37. // Facade门面技术静态接管服务容器中对象的访问
  38. // 服务容器与工作的控制器之间再添加一个中间层: Facade
  39. class Facade {
  40. protected static $container = null;
  41. // 给当前facade类中的$container属性进行赋值,将container注入到当前facade类中
  42. public static function initialize(Container $container )
  43. {
  44. static::$container = $container;
  45. }
  46. }
  47. //模型类 成员的访问静态化:
  48. class UserModel extends Facade
  49. {
  50. public static function getData()
  51. {
  52. //后期静态绑定
  53. return static::$container->make('model')->getData();
  54. }
  55. }
  56. //视图类 成员的访问静态化:
  57. class UserView extends Facade
  58. {
  59. public static function fetch($data)
  60. {
  61. //后期静态绑定
  62. return static::$container->make('view')->fetch($data);
  63. }
  64. }
  65. // <==========================================================================>
  66. class Controller {
  67. //构造方法,初始化facade
  68. public function __construct(Container $container)
  69. {
  70. Facade::initialize($container);
  71. }
  72. //使用门面技术facade方式 访问成员
  73. public function index()
  74. {
  75. //1. 获取数据
  76. $data = UserModel::getData();
  77. //2.模板渲染
  78. return UserView::fetch($data);
  79. }
  80. }
  81. // 实例化输出
  82. $contr = new Controller($container);
  83. echo $contr->index();
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议