Blogger Information
Blog 25
fans 1
comment 1
visits 17089
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0221作业+用composer手撸MVC框架+10期线上班
江川林
Original
559 people have browsed it

前言:

在自己手撸之前,看了视频4遍,还是觉得逻辑不清晰,有点乱,可能是以为接触得少加上基础不行,所以又去搜索了一些相关资料,最后将框架撸出来后,再把逻辑理一下,发现其实都是有规律存在的,并不难

所以,大家一定要:多看多练多去理解,很重要

———————————————————————————

正题:用composer手撸MVC框架(还是用老师的流程)

一,在用composer之前,首先要知道composer的常用指令
1,搜索一个包composer search
2,安装一个包composer requirecomposer install
3,更新一个包composer update
4,删除一个包composer remove
5,依赖打包composer archive(本次未用)
6,类库映射composer dump(很重要)
7,生成/更新composer.jsoncomposer init
8,从composer创建项目
composer create-project 包 项目目录
二,详细步骤
-创建首页文件,生成composer.json文档,再利用终端指令composer install生成composer相关文档和目录,其中的autoload.php就是非常重要的composer自动加载器

-创建核心文件夹,新建文档Bootstrap.php,在里面设置与文档路径一致的命名空间,并且生成一个和文档名一样的类名

-在composer.json中设置类库映射,并且执行composer dump

-在Bootstrap.php这个文档中,进行URL解析,解析出相对应的控制器和方法

-再新建控制器,在控制里面测试视图类和模型类

同时就要新建控制器文件、视图文件类、模型类文件
注意:
-在视图类文件中,需要有以下几步:
1,模板文件
2,模板变量(建立数组)
3,读取模板文件(make方法):给模板文件赋值
4,分配模板变量(with方法):将参数传进数组中,成为关联数组
5,加载模板文件:__toString()
流程:// make —> with —> toString

-在模板类文件里面,需要以下几步:
1,连接对象
2,设置数据表
3,连接数据库:__construct()
4,设置数据表
5,进行是数据库操作

以上是大体的框架流程:
最主要的是要理解composer自动加载原理,这个框架执行顺序和MVC框架的原理

因为代码量较大,以下是关键代码:
Bootstrap.php

  1. <?php
  2. //框架启动器
  3. namespace core;
  4. use web\controller\Controller;
  5. use web\controller\Undefined;
  6. class Bootstrap
  7. {
  8. public static function run()
  9. {
  10. // echo '我是框架启动器';
  11. // echo '<hr>';
  12. Bootstrap::parseUrl();
  13. }
  14. // 解析URL里面的控制器和方法
  15. public static function parseUrl()
  16. {
  17. // 获取URL中的字符串
  18. $_SERVER['QUERY_STRING'];
  19. // 以数组的形式解析出来
  20. parse_str($_SERVER['QUERY_STRING'], $url);
  21. // 判断解析出来的URL数据,是自定义控制器还是默认控制器
  22. if (isset($_GET['c'])){
  23. // 生成自定义控制器的类名
  24. $controller = 'web\controller\\' . ucfirst($url['c']);
  25. // 生成自定义控制器的方法名
  26. $action = $url['a'];
  27. // 解析URL中的其他参数
  28. $other = array_filter(array_slice($url, 2));
  29. //$site = php.cn;
  30. extract($other);
  31. }else{
  32. // 如果URL中没有解析到自定义的控制器和方法,则使用默认的控制器和方法
  33. // 默认控制器的类名
  34. $controller = 'web\controller\Undefined';
  35. // 默认控制器的方法名
  36. $action = 'action';
  37. }
  38. // 测试控制器
  39. echo (new $controller)::$action($site);
  40. }
  41. }

Controller.php

  1. <?php
  2. namespace web\controller;
  3. use core\View;
  4. use core\Model;
  5. use function core\dump;
  6. class Controller
  7. {
  8. public static function action()
  9. {
  10. echo '自定义的控制器:' . __METHOD__;
  11. }
  12. public static function study($site)
  13. {
  14. echo '我在:' . $site . ',学习PHP';
  15. }
  16. // 测试视图模板
  17. public static function index()
  18. {
  19. // 实例化视图类
  20. $view = new View();
  21. return $view->make('View')->with('site', 'php.cn');
  22. }
  23. // 测试模型模板
  24. public static function modelTest()
  25. {
  26. // 获取数据
  27. // 实例化模型类
  28. $model = new Model('mysql:host=localhost;dbname=phpedu', 'root', 'root');
  29. // 进行多条查询
  30. $datas= $model->select('staffs');
  31. // 渲染模板
  32. // 实例化视图类
  33. $view = new View();
  34. return $view->make('Model')->with('datas', $datas);
  35. }
  36. }

View

  1. <?php
  2. namespace core;
  3. class View
  4. {
  5. // 模板文件
  6. protected $file;
  7. // 模板变量
  8. protected $params= [];
  9. // 读取模板文件
  10. public function make(string $data) : object
  11. {
  12. $this->file = 'view/' . $data . '.php';
  13. return $this;
  14. }
  15. // 分配模板变量
  16. public function with(string $name, $values) : object
  17. {
  18. $this->params[$name] = $values;
  19. return $this;
  20. }
  21. // 加载并渲染模板
  22. public function __toString() : string
  23. {
  24. // 解析出变量
  25. extract($this->params);
  26. // 加载模板文件
  27. require $this->file;
  28. return ' ';
  29. }
  30. // make --> with --> toString
  31. }

Model

  1. <?php
  2. namespace core;
  3. use Nette\Database\Connection;
  4. class Model
  5. {
  6. // 连接对象
  7. private $database;
  8. // 数据表名称
  9. private $table;
  10. // 连接数据库
  11. public function __construct($dsn, $user, $password)
  12. {
  13. return $this->database = new Connection($dsn, $user, $password);
  14. }
  15. // 设置数据表
  16. public function table(string $table) : object
  17. {
  18. $this->table = $table;
  19. return $this;
  20. }
  21. // 查询数据库信息,多条查询
  22. public function select($table)
  23. {
  24. return $this->table($table)->database->query( 'SELECT * FROM ' . $this->table);
  25. }
  26. // 单条查询
  27. public function one($table, $id)
  28. {
  29. return $this->table($table)->query('SELECT * FROM ' . $this->table. ' WHERE id=? ', $id)->dump();
  30. }
  31. }

谢谢老师审阅!

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!