博客列表 >php 中的MVC,服务容器,门面技术,路由解析

php 中的MVC,服务容器,门面技术,路由解析

王娇
王娇原创
2020年05月17日 18:32:27646浏览

学习总结

  • 使用MVC可以有效的把底层的数据库操作和前端的页面渲染分开
  • 使用服务容器可以把模型和视图封装在服务容器中,减少对外部对象的依赖
  • 门面技术,可以把模型和视图中的普通方法封装成静态方法,方便客户端调用
  • 路由解析可以把url地址中的控制器,方法,参数进行有效解析

效果展示

1.模型类 Model.php

  1. <?php
  2. namespace nMVC
  3. {
  4. use PDO;
  5. class Model
  6. {
  7. public function getData():array
  8. {
  9. $dbConn = new \PDO('mysql:host=localhost;dbname=db_phpstudy','root','root');
  10. $res = $dbConn->query('SELECT * FROM `tb_goods` LIMIT 10')->fetchAll(\PDO::FETCH_ASSOC);
  11. return $res;
  12. }
  13. }
  14. }
  15. ?>

2.视图类 View.php

  1. <?php
  2. namespace nMVC
  3. {
  4. class View
  5. {
  6. public function showData($records)
  7. {
  8. echo '<style>
  9. * {
  10. padding: 0px;
  11. margin: 0px;
  12. box-sizing: border-box;
  13. }
  14. .show
  15. {
  16. width: 600px;
  17. height: 500px;
  18. border: 1px solid #555;
  19. margin-left: auto;
  20. margin-right: auto;
  21. margin-top:20px;
  22. background-color: lightseagreen;
  23. display: flex;
  24. flex-flow: column nowrap;
  25. justify-content: space-evenly;
  26. align-items: center;
  27. }
  28. .show>div
  29. {
  30. width: 100%;
  31. border-bottom: 1px solid white;
  32. display: flex;
  33. flex-flow: row nowrap;
  34. justify-content: space-evenly;
  35. align-items: center;
  36. }
  37. .show>div:first-of-type
  38. {
  39. font-size: larger;
  40. font-weight: bolder;
  41. }
  42. .show>div>span
  43. {
  44. text-align: center;
  45. }
  46. .show > div > span:nth-of-type(1) {
  47. width: 50px;
  48. }
  49. .show > div > span:nth-of-type(2) {
  50. width: 150px;
  51. }
  52. .show > div > span:nth-of-type(3) {
  53. width: 150px;
  54. }
  55. .show > div > span:nth-of-type(4) {
  56. width: 100px;
  57. }
  58. </style>';
  59. echo '<div class="show">';
  60. echo '<h2>商品信息展示</h2>';
  61. echo '<div><span>编号</span><span>名称</span><span>价格</span><span>时间</span></div>';
  62. foreach($records as $record)
  63. {
  64. echo '<div >';
  65. echo '<span>',"{$record['id']}",'</span>';
  66. echo '<span>',"{$record['name']}",'</span>';
  67. echo '<span>',"{$record['price']}\\{$record['unit']}",'</span>';
  68. echo '<span>',"{$record['sdate']}",'</span>';
  69. echo '</div>';
  70. }
  71. echo '</div>';
  72. }
  73. }
  74. }
  75. ?>

3.服务容器类 Container.php

  1. <?php
  2. namespace nMVC
  3. {
  4. require 'Model.php';
  5. require 'View.php';
  6. class Container
  7. {
  8. protected $case = [];
  9. public function bind($alias,\Closure $proce)
  10. {
  11. $this->case[$alias] = $proce;
  12. }
  13. public function make($alias)
  14. {
  15. return call_user_func_array($this->case[$alias],[]);
  16. }
  17. public function delete($alias)
  18. {
  19. unset($this->case[$alias]);
  20. }
  21. }
  22. }
  23. ?>

4.门面类 Facede.php

  1. <?php
  2. namespace nMVC
  3. {
  4. require 'Container.php';
  5. class Facede
  6. {
  7. protected static $container = null;
  8. protected static $data = [];
  9. public static function init($container)
  10. {
  11. static::$container = $container;
  12. }
  13. }
  14. class Model1 extends Facede
  15. {
  16. public static function getdata()
  17. {
  18. static::$data = static::$container->make('model')->getdata();
  19. }
  20. }
  21. class View1 extends Facede
  22. {
  23. public static function showdata()
  24. {
  25. $records = static::$container->make('view')->showdata(static::$data);
  26. return $records;
  27. }
  28. }
  29. }
  30. ?>

5.控制器类 Controller4.php

  1. <?php
  2. namespace nMVC
  3. {
  4. require 'Facede.php';
  5. class Controller4
  6. {
  7. public function __construct(Container $container)
  8. {
  9. Facede::init($container);
  10. }
  11. public function index()
  12. {
  13. Model1::getdata();
  14. return View1::showdata();
  15. }
  16. }
  17. echo 'controller4 Facede 门面技术<br>';
  18. //创建一个服务容器的对象
  19. $container = new Container();
  20. //服务容器绑定数据
  21. $container->bind('model',function(){ return new Model; });
  22. $container->bind('view',function(){ return new View; });
  23. //创建一个控制器
  24. $controller4 = new Controller4($container);
  25. echo $controller4->index();
  26. //对象销毁
  27. $container->delete('model');
  28. $container->delete('view');
  29. }
  30. ?>

6.路由解析Route.php

  1. <?php
  2. class GoodsController
  3. {
  4. public function showdata($id,$name)
  5. {
  6. echo '商品编号:',$id,'<br>';
  7. echo '商品名称:',$name,'<br>';
  8. }
  9. }
  10. //http://localhost/php11/0514/Route.php/goods/showdata/id/1/name/%E7%99%BD%E8%8F%9C/sdate
  11. //获取pathinfo信息
  12. $pathInfoStr = $_SERVER['PATH_INFO'];
  13. //过虑空数组元素,生成一个数组
  14. $pathInfoArr = array_values(array_filter(explode('/',$pathInfoStr)));
  15. //获取要访问的控制器
  16. $controller =ucfirst(array_shift($pathInfoArr)) .'Controller';
  17. //获取要访问的控制器的方法
  18. $method = array_shift($pathInfoArr);
  19. //获取参数
  20. $paras = [];
  21. for($i=0;$i<count($pathInfoArr);$i+=2):
  22. //如果参数没有值就不解析这个参数
  23. if(isset($pathInfoArr[$i+1])):
  24. $paras[$pathInfoArr[$i]] = $pathInfoArr[$i+1];
  25. endif;
  26. endfor;
  27. //动态生成一个控制器类,动态调用控制器类中的方法
  28. $goods = new $controller();
  29. $goods->$method(...array_values($paras));
  30. ?>

效果展示

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议