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

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

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

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

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

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

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

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

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

最接近的处理方式是 @overtrue 大神的 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 框架尚未完善,已经有几个已知问题待处理。
有兴趣看代码的同学欢迎提点建议!

本帖由系统于 4周前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13
Shuyi

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

4周前
BradStevens

phalcon 这个框架一直在更新的

4周前
henter

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

4周前

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

4周前
BradStevens

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

4周前
Shuyi

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

4周前
Chasers9527

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

4周前
LiCxi

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

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

@suhanyujie 仔细看 :sweat_smile:

3周前

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

3周前
Eangel

秀,怎么不用go呢

2周前

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

2周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!