博客列表 >composer.json的autoload字段files, classmap, psr-4,composer做一个php开发框架-php-36课8.7

composer.json的autoload字段files, classmap, psr-4,composer做一个php开发框架-php-36课8.7

希望
希望原创
2020年08月08日 18:20:421495浏览

一、使用composer中的自动加载功能

1.composer.json的files: 可以加载任意位置的类文件

2. 注册类别名,比如:use blog\Order;

  • 在app下的controller下的创建User.php
  1. <?php
  2. namespace app\controller;
  3. class User
  4. {
  5. public static function hello()
  6. {
  7. return __METHOD__;
  8. }
  9. }
  • 在lib文件夹里创建Order.php
  1. <?php
  2. namespace blog;
  3. class Order
  4. {
  5. public static function hello()
  6. {
  7. return __METHOD__. '你好';
  8. }
  9. }
  • 在lib文件夹里创建Goods.php
  1. <?php
  2. namespace blog;
  3. class Goods
  4. {
  5. public static function hello()
  6. {
  7. return __METHOD__. '商品';
  8. }
  9. }

3.autoload: psr-4: 类的命名空间: 类所在的路径目录 进行绑定, 命名空间最后必须以”\“空间分隔符结尾,这样可以把同名空间下的所有类统一路径

  • 同文件夹lib里面的两个php文档,同名空间blog下的不同类,写法:”blog\“: “lib”
  • composer.json里面的内容
    1. {
    2. "autoload": {
    3. "psr-4": {
    4. "app\\controller\\": "app/controller",
    5. "blog\\": "lib"
    6. }
    7. },
    8. "require": {
    9. "gregwar/captcha": "^1.1"
    10. }
    11. }

    4.composer.json: autoload: classmap: 类映射 , 实现类的批量注册

  • 创建demo3.php
  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. // 注册类别名[可选]
  4. use app\controller\User;
  5. use blog\Order;
  6. use blog\Goods;
  7. // 调用类成员
  8. echo User::hello();
  9. echo '<hr>';
  10. // 调用lib/Order::hello()
  11. echo Order::hello();
  12. echo '<hr>';
  13. echo Goods::hello();

二、如何在项目中使用第三方的依赖库/组件,比如登录界面实时生成验证码

1. 创建demo4.php

  1. <?php
  2. // composer自动加载器
  3. require_once __DIR__.'/vendor/autoload.php';
  4. // 注册类,命名空间
  5. use Gregwar\Captcha\CaptchaBuilder;
  6. // 创建验证器类实例/对象
  7. // 生成一个验证码
  8. $captcha = new CaptchaBuilder;
  9. $captcha
  10. ->build()
  11. ->save('out.jpg')
  12. ;
  13. // 获取到验证码
  14. $_SESSION['phrase'] = $captcha->getPhrase();
  15. // 查看一下验证码:
  16. echo '验证码是: ' , $_SESSION['phrase'];
  17. ?>
  18. <!DOCTYPE html>
  19. <html lang="en">
  20. <head>
  21. <meta charset="UTF-8">
  22. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  23. <title>Document</title>
  24. </head>
  25. <body>
  26. <h3>用户登录</h3>
  27. <div>
  28. <label for="">邮箱:</label>
  29. <input type="email" name="" id="">
  30. </div>
  31. <div>
  32. <label for="">密码:</label>
  33. <input type="password" name="" id="">
  34. </div>
  35. <div>
  36. <label for="">验证码:</label>
  37. <img src="<?php echo $captcha->inline(); ?>" onclick="location.reload()" />
  38. </div>
  39. <div>
  40. <button>提交</button>
  41. </div>
  42. </body>
  43. </html>

2.从第三方https://packagist.org拿到指令

  • 复制composer require gregwar/captcha
  • 放入VSCode新终端,运行,就会自动生成gregwar文件夹及其它依赖,并在composer.json里自动生成以下代码
    1. "require": {
    2. "gregwar/captcha": "^1.1"
    3. }

三.使用composer快速实现一个迷你的php开发框架,比如数据库列表信息

1.在根目录下创建frame项目,用MVC来做

  • M: Model 使用第三方包实现
  • V: View 使用第三方实现
  • C: Controller业务逻辑主要是写到控制器中

2.模型与视图包复制与安装,网站:https://packagist.org

  • Model指令: composer require catfan/medoo
  • View指令: composer require league/plates

3.vendor,model, view, composer.json都已经安装准备好了

4.在frame目录下,封装一个框架的核心,名叫core,里面有两个类:Model.php, View.php

  • Model.php
  1. <?php
  2. // 模型类
  3. namespace core;
  4. use Medoo\Medoo;
  5. // 继承第三方包:vendor/catfan/src/Medoo.php,在此查看空间
  6. // 创建一个入口文件index.php
  7. class Model extends Medoo
  8. {
  9. // 构造方法: 连接数据库
  10. public function __construct()
  11. {
  12. $options = [
  13. 'database_type' => 'mysql',
  14. 'database_name' => 'phpedu',
  15. 'server' => 'localhost',
  16. 'username' => 'root',
  17. 'password' => 'melinda123'
  18. ];
  19. // 调用父类方法,需要参数是数组,Medoo.php查看
  20. parent::__construct($options);
  21. }
  22. // 自己可以封装一些方法,创建自己的模型方法库
  23. // 获取满足条件的集合中的第一条数据
  24. public function first()
  25. {
  26. }
  27. }
  • View.php
  1. <?php
  2. // 视图类
  3. namespace core;
  4. use League\Plates\Engine;
  5. // 继承第三方包:vendor/league/src/Engine.php,在此查看空间
  6. class View extends Engine
  7. {
  8. public $templates;
  9. public function __construct($path)
  10. {
  11. $this->templates = parent::__construct($path);
  12. }
  13. }

5.需要一个入口文件,在frame下创建index.php

  1. <?php
  2. use controllers\UsersController;
  3. use models\UsersModel;
  4. use core\View;
  5. require_once __DIR__ . '/vendor/autoload.php';
  6. // 测试模型
  7. $model =new UsersModel();
  8. // var_dump($model);
  9. // 测试视图
  10. $view = new View('app/views');
  11. // var_dump($view);
  12. // 测试控制器,传参
  13. $controller = new UsersController($model, $view);
  14. // var_dump($controller);
  15. // echo $controller->index();
  16. print_r($controller->select());

6.在frame下创建app文件夹,在这里面写MVC,创建三个文件夹model, view, controllers

  • 模型要对应数据表,在文件夹model下创建UsersModel.php
  1. <?php
  2. namespace models;
  3. use core\Model;
  4. // 用户自定义模型通常与一张数据表对应,继承自定义的Model
  5. class UsersModel extends Model
  6. {
  7. public function __construct()
  8. {
  9. parent::__construct();
  10. }
  11. }
  • 在文件夹controllers下创建UsersController.php
  • 并测试控制器:app/controllers/UsersController.php里面的index()方法
  • 得到:controllers\UsersController::index
  1. <?php
  2. namespace controllers;
  3. class UsersController
  4. {
  5. // 将依赖的外部模型和视图对象,使用依赖注入到构造方法中,使它在控制器中共享
  6. public $model = null;
  7. public $view = null;
  8. //构造方法,初始化
  9. public function __construct($model, $view)
  10. {
  11. $this->model = $model;
  12. $this->view = $view;
  13. }
  14. // 用于测试
  15. public function index()
  16. {
  17. return __METHOD__;
  18. }
  19. public function select()
  20. {
  21. // 通过模型获取数据
  22. $users = $this->model->select('users', ['id', 'name','email'], ['id[>=]'=>5, 'LIMIT'=>5]);
  23. // return $users;
  24. // 将数据渲染到模板上(模板赋值),返回结果到模板引擎里了
  25. return $this->view->render('users/list', ['users'=> $users]);
  26. }
  27. }
  • 测试的时候,还要在composer.json做映射,共4个映射,用psr-4规则,并用指令composer dumpautoload进行生效
  1. {
  2. "require": {
  3. "catfan/medoo": "^1.7",
  4. "league/plates": "^3.3"
  5. },
  6. "autoload": {
  7. "psr-4": {
  8. "models\\": "app/models",
  9. "views\\": "app/views",
  10. "controllers\\": "app/controllers",
  11. "core\\": "core"
  12. }
  13. }
  14. }

7.在views下面创建users目录,在此下面创建list.php

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>用户信息</title>
  7. <style>
  8. body {
  9. display: flex;
  10. flex-direction: column;
  11. align-items: center;
  12. }
  13. table {
  14. border-collapse: collapse;
  15. border: 1px solid;
  16. width: 50%;
  17. text-align: center;
  18. }
  19. th,
  20. td {
  21. border: 1px solid;
  22. padding: 5px;
  23. }
  24. tr:first-child {
  25. background-color: #eee;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <h3>用户管理系统</h3>
  31. <table>
  32. <tr>
  33. <th>id</th>
  34. <th>姓名</th>
  35. <th>邮箱</th>
  36. <th>操作</th>
  37. </tr>
  38. <!-- 数据渲染 -->
  39. <?php foreach ($users as $user): ?>
  40. <tr>
  41. <td><?=$this->e($user['id'])?></td>
  42. <td><?=$this->e($user['name'])?></td>
  43. <td><?=$this->e($user['email'])?></td>
  44. <td><button>编辑</button><button>删除</button></td>
  45. </tr>
  46. <?php endforeach ?>
  47. </table>
  48. <p>
  49. <a href="">1</a>
  50. <a href="">2</a>
  51. <a href="">3</a>
  52. <a href="">4</a>
  53. <a href="">5</a>
  54. <a href="">6</a>
  55. </p>
  56. </body>
  57. </html>
  • 大体文档结构如下:

  • 总结:

  • 创建自己的框架核心代码core
  • ModelView分别继承第三方的包
  • 创建自己的应用,按 MVC 框架,并创建属于这个应用的 model, view, controller
  • 更新 composer.json 中类的自动映射关系,用autoload,psr-4规则
  • 创建入口文件, 使用 composer 自动加载器进行测试:测试模型,测试视图,测试控制器
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议