多文件上传-MVC依赖注入-容器管理依赖对象实现

  1. 写一个实现的多文件上传案例,并将它封装成一个可复用的函数或类
  2. 实例演示MVC与依赖注入的原理,以及服务容器对依赖对象的管理的实现过程。

1. 写一个实现的多文件上传案例,并将它封装成一个可复用的函数或类

  1. <?php
  2. // 多文件上传1
  3. function upload_multi_file1($names = ['file1', 'file2'])
  4. {
  5. foreach ($_FILES as $key => $file) {
  6. if (in_array($key, $names)) {
  7. if ($file['error']) {
  8. echo upload_err_msg($file['error']);
  9. } else {
  10. $filename = strstr($file['name'], '.', true);
  11. $extname = strstr($file['name'], '.');
  12. $path = 'uploads/' . md5($filename . time()) . $extname;
  13. if (move_uploaded_file($file['tmp_name'], $path)) {
  14. echo "<p>上传成功 {$file['name']}</p>";
  15. echo "<p><img src=\"{$path}\" width=\"150\"></p>";
  16. }
  17. }
  18. }
  19. }
  20. }
  21. // 多文件上传2,一次选中多个
  22. function upload_multi_file2($name = 'files')
  23. {
  24. if (isset($_FILES[$name]) && $_FILES[$name]['error']) {
  25. foreach ($_FILES[$name]['error'] as $key => $err) {
  26. if ($err) {
  27. echo upload_err_msg($err);
  28. } else {
  29. $filename = strstr($_FILES[$name]['name'][$key], '.', true);
  30. $extname = strstr($_FILES[$name]['name'][$key], '.');
  31. $path = 'uploads/' . md5($filename . time()) . $extname;
  32. if (move_uploaded_file($_FILES[$name]['tmp_name'][$key], $path)) {
  33. echo "<p>上传成功 {$_FILES[$name]['name'][$key]}</p>";
  34. echo "<p><img src=\"{$path}\" width=\"150\"></p>";
  35. }
  36. }
  37. }
  38. }
  39. }
  40. // 上传错误消息
  41. function upload_err_msg($err = 0)
  42. {
  43. $err_msg = [
  44. 0 => '上传完成',
  45. 1 => '超过的单文件大小',
  46. 2 => '超过前端表单限制',
  47. 3 => '上传文件不完整',
  48. 4 => '没有文件被上传',
  49. 5 => '系统保留',
  50. 6 => '找不到临时目录',
  51. 7 => '目标没有写入权限',
  52. ];
  53. if (isset($err_msg[$err])) return $err_msg[$err];
  54. return '未定义的错误';
  55. }
  56. // 多文件上传
  57. upload_multi_file1($names = ['file1', 'file2']);
  58. upload_multi_file2($name = 'files');
  59. ?>
  60. <!DOCTYPE html>
  61. <html lang="en">
  62. <head>
  63. <meta charset="UTF-8">
  64. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  65. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  66. <title>Document</title>
  67. </head>
  68. <body>
  69. <form action="" method="POST" enctype="multipart/form-data">
  70. <fieldset>
  71. <legend>多文件上传1</legend>
  72. <input type="file" name="file1">
  73. <input type="file" name="file2">
  74. <button>上传</button>
  75. </fieldset>
  76. </form>
  77. <form action="" method="POST" enctype="multipart/form-data">
  78. <fieldset>
  79. <legend>多文件上传2</legend>
  80. <input type="hidden" name="MAX_FILE_SIZE" value="10485760">
  81. <input type="file" multiple name="files[]">
  82. <button>上传</button>
  83. </fieldset>
  84. </form>
  85. </body>
  86. </html>

文件上传

文件上传

2. 实例演示MVC与依赖注入的原理,以及服务容器对依赖对象的管理的实现过程。

  • 模型 model.php
  1. namespace mvc_demo;
  2. use PDO;
  3. // 模型类
  4. class Model
  5. {
  6. // 获取数据
  7. public function getData()
  8. {
  9. try {
  10. $pdo = new PDO('mysql:host=localhost;dbname=phpedu;charset=utf8mb4', 'root', 'root');
  11. // 设置结果集的返回类型
  12. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  13. } catch (\PDOException $e) {
  14. die('连接失败:' . $e->getMessage());
  15. }
  16. $sql = "SELECT id, name, gender FROM staffs limit 5";
  17. $stmt = $pdo->prepare($sql);
  18. $stmt->execute();
  19. return $stmt->fetchAll();
  20. }
  21. }
  • 视图 view.php
  1. namespace mvc_demo;
  2. // 视图
  3. class View
  4. {
  5. // 数据展示
  6. public function fetch($datas)
  7. {
  8. $res = '';
  9. foreach ($datas as $data) {
  10. $res .= print_r($data, true) . '<br>';
  11. }
  12. return $res;
  13. }
  14. }
  • 控制器 controller.php
  1. namespace mvc_demo;
  2. use Closure;
  3. // 加载模型
  4. require 'model.php';
  5. // 加载视图
  6. require 'view.php';
  7. // 服务容器
  8. class Container
  9. {
  10. // 对象容器
  11. protected $instances = [];
  12. // 添加容器
  13. public function bind($alias, Closure $process)
  14. {
  15. $this->instances[$alias] = $process;
  16. }
  17. // 取出对象
  18. public function make($alias, $params = [])
  19. {
  20. return call_user_func_array($this->instances[$alias], $params);
  21. }
  22. }
  23. // 依赖的对象添加到容器中
  24. $container = new Container();
  25. $container->bind('model', function () {
  26. return new Model();
  27. });
  28. $container->bind('view', function () {
  29. return new View();
  30. });
  31. // 控制器
  32. // 容器获取数据
  33. class Controller
  34. {
  35. public function index(Container $container)
  36. {
  37. // 获取数据
  38. $datas = $container->make('model')->getData();
  39. // 渲染数据
  40. return $container->make('view')->fetch($datas);
  41. }
  42. }
  43. $controller = new Controller();
  44. echo $controller->index($container);
  • 运行 controller.php

控制器

更多相关文章

  1. 除了 Docker,我们还有哪些选择?
  2. flex容器的认识
  3. 【docker】容器运行nginx&&挂载宿主机文件
  4. 1210内联框架
  5. 8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互
  6. 8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映
  7. 8天入门docker系列 —— 第二天 通过一个aspnetcore程序加深对容
  8. 8天入门docker系列 —— 第三天 使用aspnetcore小案例熟悉对镜像
  9. flex容器与项目的常用属性

随机推荐

  1. android:layout_weight的真实含义
  2. Android指纹登录工具类封装
  3. Android基础笔记(七)-页面跳转和数据传递
  4. Android(安卓)弹出软键盘android:windowS
  5. Android 多渠道定制化打包
  6. 如何在Android智能手机上捕获数据包
  7. android sdk 安装时无法连接到地址
  8. 《第一行代码(第二版)》学习(二)
  9. android中gravity和layoutgravity的区别
  10. Android入门之Activity的四种启动模式