[手摸手带你创建php现代化框架] 教程终于写完了

教程地址

手摸手带你创建php现代化框架

0-1 写出来的。

刚写完的文档,有什么问题,欢迎指正。
(最下面有qq群)

可能会帮助你更容易理解框架的文档

  1. 深入 Laravel 核心: 这个有点难度,可以简单了解下
  2. PHP 设计模式全集: 官方的设计模式,略难。
  3. php设计模式学习: 简单方式实现设计模式,没有那么完善。
  4. PHP PSR 标准规范: 了解就好了。

源码

教程源码:php_frame (giteee)
原型源码: php_frame (github)

原型源码: 先写好框架,就是 原型源码, 才开始写此教程。
教程源码: 按此教程步骤走下去,会最终变成教程源码,大部分都是复制 原型源码 的。

设计方向

闭门造轮子

听到很多,不要创建重复轮子了。

最后终究还是要 学习框架底层 = 学习轮子,这也此框架目的之一。

闭门造轮 成为这个框架最大的特色。

所以此教程不是 手摸手带你组装php现代化框架, 而是 手摸手带你创建php现代化框架

不完善全部代码

指不是框架运行必要的代码, 本教程不会写!

读者自行完善, 这也可以加深读者的印象。

比如路由, get post写好了,
https://cdn.learnku.com/uploads/images/202009/11/25979/PdJ81QhSkt.png!large

put post delete 让读者去完善。

最少代码

我个人较为讨厌长代码,每个字都需要去解读。

因为 不完善全部代码 , 所以代码量才少。

如果全部都完善了,那为什么不去看 轮子 源码?

因为代码量多呗 !

目录结构

+---app
|   |   helpers.php // 函数
|   +---controller
|   |       UserController.php // 示例控制器
|   +---exceptions
|   |       ErrorMessageException.php // 错误消息返回
|   |       HandleExceptions.php // 继承core/HandleExceptions
|   +---middleware
|   |       ApiMiddleWare.php
|   |       ControllerMiddleWare.php
|   |       IsAuthMiddleWare.php 
|   |       WebMiddleWare.php // web.php加载的中间件
|   \---models
|           User.php // 示例模型
+---config
|       database.php // 数据库配置
|       log.php // 日志配置
|       view.php // 视图配置
+---core
|   |   Config.php  // 配置
|   |   Controller.php      // 基础控制器
|   |   HandleExceptions.php    // 异常&错误 托管处理
|   |   PipleLine.php   // 管道
|   |   Response.php    // 响应
|   |   RouteCollection.php // 路由
|   |   SwooleContext.php // 协程上下文管理
|   |   TestCase.php // 基础测试文件
|   +---database
|   |   |   Database.php 
|   |   +---connection
|   |   |       Connection.php
|   |   |       ConnectionInterface.php
|   |   |       MysqlConnection.php // mysql链接
|   |   |       SqlServerConnection.php 
|   |   +---model
|   |   |       Builder.php // 模型构造器
|   |   |       Model.php // 基础模型
|   |   \---query
|   |           Grammar.php
|   |           MysqlGrammar.php // 编译成sql语句
|   |           QueryBuilder.php // 查询构造器
|   +---log
|   |   |   Logger.php // 日志管理
|   |   \---driver // 不同类型日志实现
|   |           DailyLogger.php
|   |           StackLogger.php
|   |
|   +---request
|   |       PhpRequest.php  // 请求
|   |       RequestInterface.php 
|   \---view
|           Blade.php       // laravel模板引擎
|           Thinkphp.php    // tp模板引擎
|           View.php    // 视图适配器
|           ViewInterface.php 
+---public
|       index.php // 单一入口文件
+---routes
|       api.php 
|       web.php // 大部分功能可以在这里运行
+---storage
|       daily.log       // 框架日志 按日期类型 
|       php_frame.log // 框架日志 
|       swoole.pid // swoole的进程pid
+---tests
|       ExampleTest.php // 测试示例文件
+---phpunit.xml // phpunit的配置
+---app.php     // 框架要经过这个加载
+---swoole.php     // swoole的http服务器

文章目录

基础篇

  • 第一步 创建框架目录
  • 引入composer自动加载
  • composer自动加载 (解释篇)
  • 添加函数文件helpers.php
  • 创建容器 (反射解析依赖 注册树模式)
  • 关于psr规范解释
  • 关于”容器” “契约” “依赖注入” (解释篇)
  • 初始化请求(Request)
  • 响应 (Response)
  • 路由一 (路由组实现)
  • 路由二 (加入中间件)
  • 配置信息 (类似laravel)
  • 数据库连接 (多例模式)
  • 查询构造器 (query builder)

mvc实现

  • M 模型实现 (数据映射 + 原型 模式)
  • C 控制器实现 + 控制器中间件
  • V 视图实现 (Laravel Blade 引擎)
  • V 视图切换成 (ThinkPhp 模板 引擎)

其他轮子

  • 日志
  • 自定义异常 (异常托管)
  • 单元测试 (phpunit)
  • 替换成swoole的http服务器
  • 协程上下文解决request问题
  • qps测试
  • 发布到packagist.org

qq群

手摸手框架问题解答群

[手摸手带你创建php现代化框架] 教程终于写完了

站长交流群

欢迎站长进来换友链&扯淡。:smile:
(非站长勿入)
[手摸手带你创建php现代化框架] 教程终于写完了

本作品采用《CC 协议》,转载必须注明作者和本文链接
专心学习不瞎搞
本帖由系统于 3年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 46

支持,mark一下,有空学习学习 :+1:

3年前 评论

厉害,大佬,学习了

3年前 评论
xiaoAgiao

支持一波,收藏了

3年前 评论

支持一下,学习

3年前 评论

厉害了。下月学习一下

3年前 评论
流浪剑客

支持支持

3年前 评论
AloneUtopia

学习一波,辛苦了 :+1:

如果看云文档上贴的代码的注释 能更完整、规范一点的话,那可就更完美了 :see_no_evil:

3年前 评论
lyxxxh (楼主) 3年前
AloneUtopia (作者) 3年前
lyxxxh (楼主) 3年前

第一个echo 居然不是 ‘hello word’; 差评

3年前 评论
lyxxxh (楼主) 3年前

真棒,刚好在找这方面的教程

3年前 评论

大牛!!

3年前 评论
lyxxxh (楼主) 3年前

有点快啊。

3年前 评论
lyxxxh (楼主) 3年前

膜拜。抽空学习一哈。这样才能更深层的理解框架的运作原理吧。不然整天光用工具了。

3年前 评论

:+1:大哥好强,想照着你的教程敲一遍

3年前 评论

大佬 代码里有4,5处错误 我怀疑是不是大佬你故意埋的坑啊

3年前 评论
lyxxxh (楼主) 3年前
cookie20201208 (作者) 3年前
cookie20201208 (作者) 3年前
lyxxxh (楼主) 3年前

第4章:创建容器 注册树模式 有问题,应该是调用build()方法 file

3年前 评论
lyxxxh (楼主) 3年前
秦晓武

2年的变化,真大呀。加油~

3年前 评论

file 大佬,发现此处该改为get,getApp不存在此方法呢

3年前 评论
lyxxxh2 3年前
zhaogh (作者) 3年前

@zhaogh
刚刚我参考了黄教主的教程:通过 PHPStorm 配置 Hyperf 热更新开发环境

Phpstorm设置

file

Name: php
File Type: PHP
Scope: Project Files
Program: sh
Arguments: $ProjectFileDir$/reload.sh
Show Console: Always

swoole.php

file

创建reload.php

#!/bin/bash
basepath=$(cd `dirname $0`; pwd)
cd $basepath
if [ -f "./storage/swoole.pid" ];then
cat ./storage/swoole.pid
cat ./storage/swoole.pid | awk '{print $1}' | xargs kill && rm -rf ./storage/swoole.pid
fi
php swoole.php start  
# 如果你是docker: https://learnku.com/articles/39143#reply148006

启动

file

file

把数字从1 修改 4 都是自动更新的。

还有其他方式的 我没试过

  1. https://github.com/ha-ni-cc/hyperf-watch
    把他改改 又是一个能用的 :joy:

  2. Swoole实战之手撸HttpServer框架-25 添加前置进程、修改代码服务自动热更新

这个启动 swoole 的时候启动一个进程,定时器查询文件的 md5
md5 不对就重启。

3年前 评论

file 这些代码就不能格式化下吗,看着好难受 :sweat_smile:

3年前 评论
白小二

大佬,能不能给个「群号」,为了专注,我把 手机qq 删了

3年前 评论
lyxxxh (楼主) 3年前

app.php 的构造函数里有句:self::$instance = $this; 感觉有点多余,因为有 getContainer 方法了。但是删了却报错Fatal error: Allowed memory size of 2147483648 bytes exhausted。想不通为啥会报错。

2年前 评论

留个脚印,以后学习。

2年前 评论

记录一下,基础篇-4 创建容器,注册树模式

环境:windows10,php7.4

执行 index.php 的时候,提示这个错误

PHP Fatal error:  Declaration of App::has(string $id) must be compatible with Psr\Container\ContainerInterface::has(string $id): bool in D:\sinmu\code\myframe\php_frame\app.php on line 34

我不理解的为啥会报错,但是我对着ContainerInterface中的has方法,发现App类少了返回类型声明和返回值,我修改如下

file

神奇的是,必须同时保留上图修改的2处才不会报错。

请教一下各位大佬,我这里不添加上图中的2处出现报错的原因是啥(猜测是phppsr/container的版本问题,待我找到psr/container的github项目再补充)。

我尝试搜索了Declaration of App::has($id) must be compatible with,stackoverfollow有个帖子说是php版本得小于7.2,但是上面说到psr/container的版本是1.x,详情参见stackoverflow.com/questions/665262...


补充,这里应该是强制类型惹的祸,在Psr\Container\ContainerInterface这个接口里面,has方法加了强类型,导致实现的时候也要强制类型,并且返回对应的结果。

改正如下

  1. Psr\Container\ContainerInterface这个接口的has方法去掉强类型就好,其他的不用变
  2. 实现类的方法里面加上强类型和return type即可
2年前 评论
lyxxxh (楼主) 2年前
sinmu (作者) 2年前

@sinmu 因为容器接口更新后要求 has 方法的实现必须返回 bool 值。
feat: add return type hints

file

2年前 评论
sinmu 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
87
粉丝
105
喜欢
480
收藏
717
排名:109
访问:8.7 万
私信
所有博文
社区赞助商