🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
把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,可选为:\[:month\] 或 Webman:用{xx},可选为:\[{xx}\] j、TP的 路由变量 也会出现在 Request 中读取,而 Webman 没有; k、TP的路由变量的值,为字母、数字、.号、\_号组成,其他的都不会出现(后面的也会被截断); Webman的路由变量的值,除了 #号、?号、/号、\\号 外都支持。 l、路由变量的匹配: TP:路由变量名 和 方法的参数名 必须一致,否则出错,它会按 名称 来给参数赋值; Webman:路由变量名随便定义,它会按 顺序 给方法的参数一一赋值; m、返回的路由地址区别: TP:app('request')->rule()->getRule(); 返回的路由地址 不是 /号 开头,路由变量格式:; 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);