初学webman,和自己之前了解的tp6做了对比,简单的分享、建议一下~

深林孤鹰

我一直是TP的用户,从v3、v5到v6都撸过几遍官方教程,今年开始了解了CRMEB和二开,直到真正做项目,认识workerman也是从CRMEB的技术说明才知道的,看了workerman的介绍,真心感觉不错,虽然刚出不久,但作者大神能把PHP还能玩成这花样真是意想不到,相见恨晚呐,于是花了一周时间撸了官方教程,不得不说官方教程确实比TP的简洁(TP的500多页PDF),而且框架也是轻量的(不像TP有点过度封装,啰啰嗦嗦),但TP也有一些方便实用的东西而Webman没有的,看帖子作者不了解TP,所以我想着来简单分享建议一下(菜鸟级别的)。
1、容器
TP6中有容器和依赖注入,调用其他类的方法时会非常便捷,而且默认是单例类(也可以选择非单例),比如:
class Foo
{
public function __construct(Bar $bar)
{}
public function bar(Bar $bar)
{
// ...
}
}
$foo = invoke('Foo'); //自动注入构造函数
$result = invoke(['Foo', 'bar']);//自动注入方法中
或者:$arrayItem = app('org\utils\ArrayItem'); //容器构造
Webman中好像需要插件才支持依赖注入,但没有容器的概念。

2、路由
TP6默认的路由是支持控制器中子目录的,比如:
app\Controller\admin\Index.php,访问时是:
/admin.index/方法名
而Webman中不可行,看了作者大神的帖子,可以对每个路由重新定义,也可以使用一段代码来自动路由,但我觉得不太方便,而且发现会和多应用的路由有一个冲突,比如:
app/test/Controller/Index.php
app/Controller/test/Index.php
同时存在时,Webman就报错无法启动了。。
另外,我觉得 自动路由优先级应该小于手动路由,不然手动路由就没办法存在了(都被替换掉了)

3、中间件
中间件两个感觉差不多,虽然我没用到控制器中间件,但感觉这个也是相对重要,希望还是能有~

4、事件
这个Webman还没有,我想作者大神以后会加进去的。

5、其他
TP6的门面(Facade),感觉也方便那么一点,没有其实也无所谓,就是静态方式调用对象的方法,有了依赖注入或容器也差不多。
TP6的服务一直没用到,所以也不清楚具体作用。。
另外,关于访问的URL对应的控制器、方法和参数,官方说明不是很详细,比如TP6中明确说:
/控制器/方法名/参数名1/参数/参数名2/参数。。。
而Webman没有说明如何给控制器方法传参,还得自己试(还是只能靠Get或Post?)
最后有个问题,Webman对大文件上传有没有好的现成的方案呢?

我会一直关注Workerman系列和作者大神的,目前先用TP6把这票干完,后面我的游戏引擎框架后台会用GateWay试试,同时也试着参与贡献下,对于我这种不会Java和Go的真是福音,哈哈~
愿这个框架会发扬光大~

6401 5 2
5个回答

Mr_Deng

爱分享是好事,但是可以再多学习下,workerman yyds

  • 深林孤鹰 2022-07-19

    刚入坑一周左右,学习之路漫漫其修远兮^^

liziyu

精神可嘉,加油!

walkor

非常好的分享,非常感谢。
1、workerman自带容器,容器符合PSR11规范。容器默认不支持依赖注入。不过可以通过安装 php-di/php-di来支持依赖注入。因为并不是所有用户都需要依赖注入,所以这部分没有强制安装,需要的用户选择安装也很方便,参考依赖注入文档
webman容器的用法就是PSR11规范的用法

use support\Container;
Container::get('类名');
Container::make('类名', [构造函数参数]);

2、/admin.index/方法名 这样的默认路由看起来不是很规范,webman不支持这样的用法。路由有冲突需要给用户一个提示(当然报错可能不是一个好的方案),否则有一个路由不生效用户可能以为是bug调试很久。复杂的业务目录路由目前没有想到好的解决方案,如果你有欢迎提出。

3、控制器中间件后面会支持

4、这个有插件,在 https://www.workerman.net/plugin/64 ,还没来得及写文档

5、门面感觉有点鸡肋,不支持智能提示,手写一个静态代理类感觉更简单。当然有需要的用户可以自己实现一个门面,放到插件市场给大家使用。

再次感谢你的建议分享,也希望大家多建议分享自己的想法

  • 深林孤鹰 2022-07-19

    谢谢作者大神回复~依赖注入那节不小心跳过了没看,原来是有容器的啊哈哈,抱歉抱歉~再有几个问题希望能不厌其烦的解答下:
    1、自动路由会产生单、多应用可能冲突,导致Webman无法运行的问题,TP的做法是默认单应用,如果开启多应用的话单应用就会自动关闭,不知这种解决方案如何。
    2、其实平时也用不到复杂路由的情况,我觉得自动路由已经满足需求了,但自动路由如何和路由中间件结合呢?
    3、Wokerman不能像TP那样用PATHINFO给控制器和方法传参吗:
    URL:/Example/func/param1/hello
    PHP:
    class Example {
    public func($param1) {。。。}
    }
    还是只能使用 POST 和 GET传参?
    4、有木有大文件上传的案例或者示例、解决方案什么的文章,想参考下~
    谢谢~

  • walkor 2022-07-19

    1、路由冲突解决下就好了,感觉因此关闭单应用并不是用户想要的方案
    2、如果需要路由中间件需要在config/route.php中单独配置
    3、目前不支持这样的用法,感觉这样会有和默认路由冲突的情况,如果需要美化可以设置自定义路由实现
    4、webman本身没有在内部支持大文件分段上传。分段上传属于业务逻辑范畴。普通文件上传是支持的,如果上传的文件较大需要设置congfig/server.php max_package_size选项

  • 深林孤鹰 2022-07-19

    2、我使用了自动路由插件(https://github.com/webman-php/auto-route),但我还想对其中某些路由增加中间件的话,貌似就不能用自动路由了,会有 FastRoute\BadRouteException: Cannot register two routes matching "/test/index/index" for method "GET" 的重复定义路由的错误(TP里不会对重复的报错,而是按先匹配的进入)。。
    其他问题基本了解了~

  • walkor 2022-07-20

    感觉先匹配进入不是很好,开发者本来期望进入后面的,但是实际进入前面的,开发者为此可能要debug很久才找出问题。直接报错告诉开发者路由冲突了,让开发者决定使用哪个路由好些

  • 深林孤鹰 2022-07-20

    自动路由方便的一点是可以自动识别多种目录结构的控制器,手动路由可以定义路由组、中间件等等。看来自动路由和手动路由只能二选一了,如果能有更好的方案我再来提供,谢谢作者大神了~

  • 周小云 2022-10-24
    Container::get(BalanceService::class)->updateUserAmount($user, [
                'amount' => Common::toInt($data['amount']),
                'type' => BalanceLog::PLATFORMRECHARGE,
                'remark' => $data['remark']
            ]);

    我这样写 phpstorm updateUserAmount 对这个方法显示未使用 不高亮

  • 27025011 2023-07-04

    phpstorm updateUserAmount 对这个方法显示未使用 不高亮.这个是编译器问题.

nitron

不算冷的冷知识

Workerman差不多有8年历史,不是刚出不久.

DI不是人人必须,Facade没有提示让人抓狂

  • 深林孤鹰 2022-07-20

    是webman刚出不久,打错了。。哈哈

  • liziyu 2022-07-20

    @深林孤鹰 webman实际上是 workerman的http应用,这么算来出来蛮久的了!哈哈

  • Le 2022-07-20

    没有提示,确实很难受

  • 深林孤鹰 2022-07-21

    哈哈

gddd

为啥我感觉这些建议都没用,而且有些 在webman里面已经有了

年代过于久远,无法发表回答
🔝