博客列表 >php学习:第24章 使用composer快速手撸一个框架

php学习:第24章 使用composer快速手撸一个框架

王小飞
王小飞原创
2020年05月20日 16:54:34804浏览

Composer 命令

composer 项目 1+2 结构

  • 一个目录 : vendor
  • 二个文件: composer.json, composer.lock

composer.json

  • 描述了当前项目所依赖的包/组件/类库和版本
  • json格式
  • 交互式创建: composer init

composer install

  • 如果存在composer.lock,就安装这里面要求的包的版本
  • 否则就安装composer.json中的包,并创建composer.lock,将安装好的包的版本等信息写入到composer.lock

composer update

  • 主要是检查composer.json是否有更新
  • 如果有,就安装这个包,并将这个包的相关信息写入到composer.lock

require

  • 如果不存在composer.json,composer.locl,vendor的时候, 会全自动创建

create-project 创建项目

  • composer create-project laravel/laravel blogs

composer dump-autoload

  • composer.json中的”autoload”中的空间映射生效
  • 命令简写: composer dump

第一步 安装Composer

使用composer编写框架是 1+2 结构,即:

  1. 一个目录'vendor'
  2. 两个文件:'composer.json','composer.lock'

安装完成后检测下是否安装成功

然后开始安装catfan/medoo

进入https://packagist.org/ 搜索catfan/medoo

执行这段代码进行安装

安装成功

开始安装league/plates

安装成功

自动加载器的映射

composer.json文件中

  1. "autoload": {
  2. "psr-4": {
  3. //控制器映射 controllers为目录名也是命名空间名 app/controllers为文件夹和目录名
  4. "controllers\\": "app/controllers",
  5. //模型
  6. "models\\": "app/models",
  7. //视图
  8. "views\\": "app/views",
  9. //核心,套壳的文件,下载的模型和视图让它继承,再让真正的视图和模型继承它
  10. "core\\": "core"
  11. }
  12. },

更新文件后一定在命令行更新:Composer dump 进行更新

安装完毕以后开始写控制器代码MVC

控制器:

  1. <?php
  2. // 命名空间: 包名称
  3. namespace controllers;
  4. // 控制器里面创建一个类
  5. class StaffsController
  6. {
  7. //模型属性
  8. public $model;
  9. //视图属性
  10. public $view;
  11. //模型的 构造方法
  12. public function __construct($model, $view)
  13. {
  14. $this->model = $model;
  15. $this->view = $view;
  16. }
  17. // 视图的方法
  18. public function display()
  19. {
  20. //在本控制器文件中加载视图文件
  21. include 'app/views/staffs/list.php';
  22. }
  23. // 查询数据库
  24. public function select()
  25. {
  26. //这里调用$this->model 会调用到核心文件 核心文件填写数据库的信息,核心文件继承catfan/medoo 使用的catfan/medoo里面的数据库方法
  27. $staffs = $this->model->select('jizhang',['id','jine','chengyuan','beizhu'],
  28. ['id[>=]'=>5, 'LIMIT'=>10]);
  29. return $this->view->render('staffs/list', ['staffs' => $staffs]);
  30. }
  31. }

模型代码:

  1. <?php
  2. namespace models;
  3. use core\Model;
  4. //继承核心模型 也就是套壳的模型,套壳的模型继承下载的模型和视图方法
  5. class StaffsModel extends Model
  6. {
  7. public function __construct()
  8. {
  9. parent::__construct();
  10. }
  11. }

视图代码:

  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: #f79baf;
  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. <th>管理</th>
  38. </tr>
  39. <?php foreach ($staffs as $staff): ?>
  40. <tr>
  41. <td><?= $this->e($staff['id']) ?></td>
  42. <td><?= $this->e($staff['jine']) ?></td>
  43. <td><?= $this->e($staff['chengyuan']) ?></td>
  44. <td><?= $this->e($staff['beizhu']) ?></td>
  45. <td><button>编辑</button><button>删除</button></td>
  46. </tr>
  47. <?php endforeach ?>
  48. </table>
  49. </body>
  50. </html>

核心文件 套壳文件代码 继承第三方组件库

模型

  1. <?php
  2. namespace core;
  3. use Medoo\Medoo;
  4. // 公共模型 核心,套壳的文件,下载的模型和视图让它继承,再让真正的视图和模型继承它
  5. class Model extends Medoo
  6. {
  7. //构造方法 这里的方法参考catfan/medoo官方
  8. public function __construct()
  9. {
  10. $options = [
  11. 'database_type' => 'mysql',
  12. 'database_name' => 'php',
  13. 'server' => 'localhost',
  14. 'username' => 'root',
  15. 'password' => '123456',
  16. ];
  17. parent::__construct($options);
  18. }
  19. public function init()
  20. {
  21. }
  22. }

视图

  1. <?php
  2. namespace core;
  3. use League\Plates\Engine;
  4. // 公共视图 核心,套壳的文件,下载的模型和视图让它继承,再让真正的视图和模型继承它
  5. class View extends Engine
  6. {
  7. private $templates;
  8. //传的参数代表模板路径
  9. public function __construct($path)
  10. {
  11. $this->templates = parent::__construct($path);
  12. }
  13. }

首页代码 index.php

  1. <?php
  2. //自动文件加载器
  3. require 'vendor/autoload.php';
  4. use controllers\StaffsController;
  5. use models\StaffsModel;
  6. use core\View;
  7. // 模型处理 得到模型里面内容 模型继承核心 核心继承下载的模型
  8. $model = new StaffsModel();
  9. // var_dump($model);
  10. // echo '<hr>';
  11. // 视图 得到视图里面的内容 也就是消费明细表
  12. $view = new View('app/views');
  13. // var_dump($view);
  14. // echo '<hr>';
  15. // 查询 new控制器 传参模型和视图
  16. $controller = new StaffsController($model, $view);
  17. // var_dump($controller);
  18. // 直接打印里面的select方法
  19. echo $controller->select();

最终效果:

总结:第一次接触框架,感觉跟mvc挺像,里面的关系还是比较乱,从头理下来会清楚一些,就是第三方的组件说明全是英文 用起来感觉会有些吃力

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