博客列表 >0517 mvc架构模式思想

0517 mvc架构模式思想

千山暮雪
千山暮雪原创
2021年05月20日 22:53:28504浏览

1.MVC (一种架构模式)

使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

  • M: Model(模型层),最bottom一层,是核心数据层,程序需要操作的数据或信息.
  • V:View (视图层),最top一层,直接面向最终用户,视图层提供操作页面给用户,被誉为程序的外壳.
  • C: Controller(控制层),是middile层, 它负责根据用户从”视图层”输入的指令,选取”数据层”中的数据,然后对其进行相应的操作,产生最终结果。

模型层-model.php

  1. <?php
  2. class Model
  3. {
  4. public function getData()
  5. {
  6. $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=user';
  7. $username = 'root';
  8. $password = 'root123';
  9. $pdo = new PDO($dsn, $username, $password);
  10. $sql = "select `username`,`sex` from `users` order by `id` asc limit 5";
  11. $stmt = $pdo->query($sql);
  12. $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  13. return $res;
  14. }
  15. }

视图层-view.php

  1. <?php
  2. class View
  3. {
  4. public function fetch($data)
  5. {
  6. $html = <<<EOF
  7. <table>
  8. <caption>用户信息表</caption>
  9. <thead>
  10. <tr>
  11. <td>用户名</td>
  12. <td>性别</td>
  13. </tr>
  14. </thead>
  15. <tbody>
  16. EOF;
  17. foreach ($data as $user) {
  18. $html .= "
  19. <tr>
  20. <td>{$user['username']}</td>
  21. <td>{$user['sex']}</td>
  22. </tr>";
  23. }
  24. $html .= " </tbody>
  25. </table>";
  26. return $html;
  27. }
  28. }

控制层-controller.php

  1. <?php
  2. require 'auto_load.php';
  3. class Controller
  4. {
  5. public function fetch()
  6. {
  7. $data = (new Model())->getData();
  8. echo (new View())->fetch($data);
  9. }
  10. }
  11. // 客户端
  12. (new Controller())->fetch();

2.容器与依赖注入

依赖注入是通过 php 的映射函数,解析到类在实例化的时候所依赖的类,直接将类实例化
容器对依赖注入的类\对象等进行统一接管的一个工厂

容器类-container.php

  1. class Container
  2. {
  3. // 1. 对象容器
  4. protected $instances = [];
  5. // 2. 绑定一个类、闭包、实例、接口实现到容器
  6. public function bind($abstract, Closure $concrete)
  7. {
  8. $this->instances[$abstract] = $concrete;
  9. }
  10. // 3. 调用容器中对象
  11. public function make($abstract, $params=[])
  12. {
  13. return call_user_func_array($this->instances[$abstract], $params);
  14. }
  15. }

控制器-controller3.php

  1. require 'auto_load.php';
  2. class Controller3
  3. {
  4. public function fetch(Container $container)
  5. {
  6. $data = $container->make('model')->getData();
  7. return $container->make('view')->fetch($data);
  8. }
  9. }
  10. $container = new Container();
  11. //绑定类到容器
  12. $container->bind('model', function () {
  13. return new Model();
  14. });
  15. $container->bind('view', function () {
  16. return new View();
  17. });
  18. // 输出
  19. echo (new Controller3())->fetch($container);

3.facade门面

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

Facade类 Facade.php

  1. class Facade
  2. {
  3. //为容器中的类提供一种静态调用方式
  4. protected static $container;
  5. public static function initialize(Container $container)
  6. {
  7. static::$container = $container;
  8. }
  9. }

UserModel类继承facade

  1. class UserModel extends Facade
  2. {
  3. public static function getData()
  4. {
  5. //静态绑定
  6. return static::$container->make('model')->getData();
  7. }
  8. }

UserView类继承facade

  1. class UserView extends Facade
  2. {
  3. public static function fetch($data)
  4. {
  5. //静态绑定
  6. return static::$container->make('view')->fetch($data);
  7. }
  8. }

控制器controller3.php

  1. require 'auto_load.php';
  2. class Controller2
  3. {
  4. public function __construct(Container $container)
  5. {
  6. Facade::initialize($container);
  7. }
  8. public function fetch()
  9. {
  10. $data = UserModel::getData();
  11. return UserView::fetch($data);
  12. }
  13. }
  14. $container = new Container;
  15. // 类绑定到容器
  16. $container->bind('model', function () {
  17. return new Model();
  18. });
  19. $container->bind('view', function () {
  20. return new View();
  21. });
  22. // 输出
  23. echo (new Controller2($container))->fetch();
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议