从ThinkPHP6移植到Webman的一些技术和经验(干货)

深林孤鹰

把ThinkPHP的官方文档撸了3遍以上,Webman撸了两边,再加上实际项目的开发和对比,才有的本文章,希望能帮到大家,如有错误和疏漏请不吝赐教~

1、webman内存常驻,业务执行只有3个流程(框架接收请求、框架执行业务逻辑、框架将结果返回给客户端);TP业务流程从 nginx/apache接收请求 到 php-fpm初始化环境,如创建变量列表 到 框架初始化(载入 Composer 的自动加载 autoload 文件 开始),如实例化各种类,包括如容器、控制器、路由、中间键等 到 数据库、Redis的连接、使用释放 到 php-fpm释放资源、销毁所有类定义、实例、销毁符号表等 到 php-fpm将结果转发给nginx/apache 到 nginx/apache将结果返回给客户端 等很多重复步骤。
2、webman没有pathinfo,只能使用常规POST、GET等来传递参数,但可以用路由来定义参数来实现类似功能;TP有pathinfo,默认为 参数/值。。。,可配置格式(个人感觉过度封装)。
3、webman默认不支持自动注入(需要安装插件),每个方法的第一个参数貌似必须是Request对象,后面才是相关的路由变量传递的参数;TP默认支持自动注入(将参数中的对象自动注入容器中已有的对应类型)。
4、Request、Response、Controller、Route、Middleware、view、ExceptionHaddler、多应用 方面,大体功能是差不多的,Webman比较精简,TP比较全面(有点凌乱不好记),有一些小区别:
多应用:TP单和多只能使用一种;而Webman默认两种同时可用(注意单应用的路由有可能会和多应用目录冲突),也有多应用模块插件可以支持更多的功能。
中间件:Webman不支持控制器中间件,全局、应用、路由中间件都大同小异。
路由:
a、TP的路由是一条条解析,匹配即进入,路由可重复定义;Webman稍有不同,定义时如果有相同路由,则控制台会报错无法启动服务(好处是及时能发现错误)。
b、TP默认支持多个路由文件(route目录,自动执行),自动载入;而Webman默认单个路由文件(config目录下的route.php)(稍微修改下可以做到类似的功能);
c、TP的多层次目录,是用 . 来分隔;而1.4之后的版本的webman也支持多层次目录,用 / 分隔。
d、路由规则的第一个参数:Webman是 / 开头,而TP不是;
e、TP的路由规则的第二个参数:TP是[控制器类, '方法'],TP是 字符串(包含目录、控制器名和方法)。
f、都不匹配的路由:TP是route::miss,Webman是route::fallback;
g、资源路由:第二个参数 和 指定方法 稍有不同;
h、TP的资源路由和Webman的资源路由名称对应:
TP:['index', 'read', 'save', 'update', 'delete']
Webman:['index', 'show', 'store', 'update', 'destroy']
i、路由变量定义:
TP:用 <xx> 或 :xx,可选为:[:month] 或 <month?>
Webman:用{xx},可选为:[{xx}]
j、TP的 路由变量 也会出现在 Request 中读取,而 Webman 没有;
k、TP的路由变量的值,为字母、数字、.号、_号组成,其他的都不会出现(后面的也会被截断);
Webman的路由变量的值,除了 #号、?号、/号、\号 外都支持。
l、路由变量的匹配:
TP:路由变量名 和 方法的参数名 必须一致,否则出错,它会按 名称 来给参数赋值;
Webman:路由变量名随便定义,它会按 顺序 给方法的参数一一赋值;
m、返回的路由地址区别:
TP:app('request')->rule()->getRule();
返回的路由地址 不是 /号 开头,路由变量格式:<xx>;
Webman:$request->route->getPath();
返回的路由地址 以 /号 开头,路由变量格式:{xx};
l、TP支持Delete的body,webman不支持,会交替循环的出现404错误。

5、插件、扩展、模块:webman 的 plugin目录 类似于 TP 的 extend目录,不过webman的命名空间是以 plugin\ 开头的,而TP的可以和普通使用一样。
6、容器:TP有app()助手函数(其实就是Container::getInstance()->make),可以实例化对象(参数3控制是否为新建);webman是用 Container来实例化对象(get为重用,make为新建)。
TP可以用 bind 绑定 标识 到 容器 中(不知有何用)。
8、webman的输出是输出到控制台,而TP是输出到页面。
9、Webman的config便捷函数可以获取配置(配置名为文件名),但只读(有插件可增删改);TP需要使用 think\facade\Config::get('文件名') 和 set($d, '文件名')来操作,TP的可读可写;
10、Webman可用TP的validate、orm(Db和Model)、Cache(Redis)、Captcha。
11、TP默认支持 .env 文件;Webman需要安装插件,或自己写一个;
注意:Webman配置文件中若使用某方法,必须写在helper.php 而非 function.php 中,因为载入配置时function还没载入。
12、门面:Webman不支持,因为虽然方便书写,但没有代码提示功能;
13、事件:TP默认支持;Webman需要安装插件;
TP:可以手动注册事件到处理器;Webman只能在 config/event.php 处理;
14、服务:未知;
15、定时任务:crontab插件
16、其他:
TP的控制器每次访问都会重新构造,并调用构造函数;Webman可以在 config/app.php 中开启:'controller_reuse' => false,不推荐 action-hook 插件(有BUG);

附带我开发和移植的两个项目(精简出的后台框架)的地址:
Pear Admin TP:https://gitee.com/pear-admin/Pear-Admin-Think
Pear Admin Webman:https://gitee.com/leamus/pear-admin-webman (还有一点东西没完善)

2513 3 4
3个评论

walkor

绝对好文。还有你的pear-admin很多人反馈非常棒

  • 深林孤鹰 2022-09-03

    谢谢作者大神,还有不好意思,这个此Pear Admin Webman非彼Pear Admin Webman,那个做的非常不错,我这个只能用来学习,哈哈~

  • walkor 2022-09-03

    从你的干货分享来看,你的admin也错不了👍

  • 深林孤鹰 2022-09-05

    有两个小建议:1是能不能把 路由变量 给Request赋值一份呢,放在any里,毕竟意义上也是请求参数;2是DELETE请求支持post内容,或者也可以不支持,但目前这样感觉是个漏洞,错误出现在了服务端返回。。

知之为知之

好东西,感谢分享

周小云

一直在想要不要写通用的curd

  • 暂无评论

深林孤鹰

170
积分
0
获赞数
0
粉丝数
2022-07-11 加入
🔝