終於受不了 Yaf,寫了個精簡框架 Zim,作為 PHP 擴充套件執行,歡迎扔雞蛋!

henter發表於2019-01-16

公司專案一直在用 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 框架尚未完善,已經有幾個已知問題待處理。
有興趣看程式碼的同學歡迎提點建議!

相關文章