终于受不了 Yaf,写了个精简框架 Zim,作为 PHP 扩展运行,欢迎扔鸡蛋!

公司项目一直在用 Yaf 框架,简单高效不废话。
但是,由于 Yaf 诞生较早,并长时间没怎么更新,导致其自身的一些硬伤迟迟得不到解决。

这些硬伤最大的有两方面:

  1. 对命名空间支持不够完善
  2. 对 HTTP 请求生命周期不方便控制

先说第二点,问题不大但是解决起来很蛋疼

Yaf 响应请求可分为 Controller 本身的 xxAction 方法 或 通过 Controller$actions 指定的 Action 文件。

对于 Action 类,默认由 execute 方法处理响应,于是你可以通过父类来控制其生命周期。
但是 Controller 里的 xxxAction 不能用类似方法实现,只能由 Yaf 一路执行到底。

有同学可能想问为什么要控制请求生命周期?
最常见的场景,比如 xxAction 内想得到 yyAction 的响应。
或者写单元测试时,希望手动执行某 action 并得到响应数据进行分析。

找过很多办法来想控制 Controller 里的 xxxAction ,但是真没有。

最接近的处理方式是 [[@overtrue](https://learnku.com/users/76)](https://learnku.com/users/76) 大神的 yaf-skeleton 项目里的处理方式。
将路由转由默认的 indexAction 统一处理。

再无其它更好的办法了(如果有烦请告知)。

再说下硬伤最严重的命名空间问题

对于经常被新人问到的 controller 命名问题、model 文件加载问题等,这就不细讲了,可以理解为 Yaf 制定的规则,遵守就好。

但是,Controller 和 Action 本身均不支持命名空间,直接导致的结果是,想在同一周期内执行两个正好同名的 action 文件是做不到的,甚至都不会报错。
具体可以参考我给 yaf 提的 issue https://github.com/laruence/yaf/issues/417

也正是提完这个 issue 后,才开始考虑是否要放弃 Yaf。

找了一圈替代者,鉴于公司项目的改造成本,实在没有一款是合适的。

最终决定基于 Zephir 来开发一款框架,编译成 PHP 扩展来尽量接近 Yaf 的性能。
同时,尽量减少从 Yaf 迁移到新框架的改造成本。

于是写了 Zim 框架

https://github.com/henter/zim

足够简单,仅提供最基础的特性:命名空间、路由分发、配置、事件、依赖注入等。

代码大部分来(copy)自(paste) Laravel 和 Symfony 组件,然后翻译成 Zephir 代码并编译为 PHP 扩展。

于是,同时提供了 zim-phpzim-ext 两个项目,功能相同,只是前者为 php 实现,后者为扩展,共用同一份单元测试。

只写了一篇简单文档:https://github.com/henter/zim/wiki

欢迎大家拍砖扔鸡蛋!

注:

目前 Zim 框架尚未完善,已经有几个已知问题待处理。
有兴趣看代码的同学欢迎提点建议!

本作品采用《CC 协议》,转载必须注明作者和本文链接
@henter henter.me
本帖由系统于 5年前 自动加精
讨论数量: 17
Shuyi

我和我的团队,把一个大型程序从CakePHP迁到了Laravel,也就花了一个多月吧……不过其中的Bug就……嗯,迁移的确是个大坑,不过有时候我宁愿壮士断腕,也不愿意继续拖着……现在谁跟我提CakePHP我跟谁急

5年前 评论
Shuyi

为什么不用Lumen呢?我理解的Yaf和Lumen做的东西是一样的,都是简单。

5年前 评论

phalcon 这个框架一直在更新的

5年前 评论
henter

@Shuyi @BradStevens Lumen 和 Phalcon 都很不错,相对于 Yaf 还是较重,考虑到迁移成本还是没选。
或者说我想要的其实只是路由分发和事件,其实项目里用到 Yaf 的也只有这两点 :-)

5年前 评论

Symfony 的 Route 组件,如果项目有大量路由,其实很伤

5年前 评论

迁移成本确实是个问题,可以未来的小项目用新框架,慢慢迁移

5年前 评论
Shuyi

我和我的团队,把一个大型程序从CakePHP迁到了Laravel,也就花了一个多月吧……不过其中的Bug就……嗯,迁移的确是个大坑,不过有时候我宁愿壮士断腕,也不愿意继续拖着……现在谁跟我提CakePHP我跟谁急

5年前 评论
幽弥狂

Lumen 好像也很一般吧,算了 我也写不出来。。。lumen 牛批

5年前 评论

我之前一直在用 C++ 写 PHP 拓展。。。遇到 Zephir 整个世界好像都亮了。。 :smile:

5年前 评论
suhanyujie
  • 额,关于命名空间,可以直接引入composer啊,只要代码支持5.6+,在Bootstrap.php中的_initPlugin中用require_once引入一下autoload.php
  • 在以后的开发中 没有声明命名空间的就是在\命名空间下,声明了命名空间的类也能使用
5年前 评论
henter

@suhanyujie 仔细看 :sweat_smile:

5年前 评论

@Hachiko sf4.x以后,symfony/route 效率已经赶上fastroute了; https://github.com/symfony/symfony/pull/26...

5年前 评论

秀,怎么不用go呢

5年前 评论

可以,值的学习下怎么写框架

5年前 评论

@Eangel 你用脚本语言去和编程语言作比较,真的好吗 , :blush:

4年前 评论
直面苦痛的人生

@Shuyi lumen跟yaf比还是差很多,性能来说,yaf是真的很快

4年前 评论
Shuyi

@Hello_21 嗯,Lumen不是说每秒3000个请求么

4年前 评论

可惜大佬的框架也是很久没有更新了,我还是用tp6

3个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!