Blogger Information
Blog 52
fans 0
comment 3
visits 42442
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php学习:第24章 使用composer快速手撸一个框架
王小飞
Original
805 people have browsed it

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挺像,里面的关系还是比较乱,从头理下来会清楚一些,就是第三方的组件说明全是英文 用起来感觉会有些吃力

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:这类工具, 输出肯定都是英文, 就像是中国人写的组件包, 也是英文描述, 没办法, 国际化
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post