[php] PhalconPHP 雷區

生而為人,不小心採到別人的地雷是很合理的。但,生而為工程師,一直採到別人的地雷就不是很合理了。


PhalconPHP

身為一個 PHPer,用一些看起來很潮的 Framework 也是很合理的。而且,他還是包成 C-Extension 的方式執行,超級潮的!

PhalconPHP 是使用 Zephir 這個工具,將 .zep 包裝成 .soC-Extension 餵給 PHP 去執行的。看,是不是很潮,核心錯誤訊息噴出來你也不知道怎麼改呢(欸

但是,潮是要付出代價的!

從 0.9x ~ 1.x 事實上沒有太多問題,因為提供的功能相對單純,所以使用上也沒有太多讓人覺得困惑的地方。再加上,反正當時也不提供原始碼,所以你也沒得抱怨。

1.x to 2.0

2.0 出現之後,官方也開始在 Github 當中提供原始碼(是使用 .zep 檔案格式,用 Zephir 去做編譯。

問題來了,每次的版本號都有雷,包含核心 打錯字(已哭

然後,大部分的問題在 2.0.7 之後,少了很多,大抵上都是比較輕微的問題。

https://github.com/phalcon/cphalcon/labels/Bug - Medium

雷區

  • 資料庫不存在時,Model 即便你有寫,他不會告警,整個應用程式會在你用到那個 Model 的時候,直接爆炸。
  • 寫測試的時候,如果 Routers 不指定 Namespace, Module 會出現異常(例如你要使用 application->dispatch 去指定一個 URI 拿 render 好的話面的時候
  • Micro Application 如果使用 Collection 來做 Handler 的話,內部的 $application 會拿不到 Handler,你必須額外處理。
  • Micro Application 的 Handler 如果 extend Phalcon\Mvc\Controller 並不會因此而可以使用其特性(例如你拿不到 dispatcher
  • Model 使用 AS alias 的 SQL 要使用底線分隔,例如 display_name 而不可以使用 displayName,否則會出現 Column Map 不存在的錯誤。
  • Model 本身不存在 transaction,真正的提供者是 modelManager 在 Controller 裡面(由 DI 提供
  • Phalcon-incubator 所提供的 UnitTest 會把 DI 做一次 reset(),所以不建議直接擴展(extend),自己寫一個比較保險。

小結

當然還是有踩到很多莫名其妙的東西,但是也不算是地雷,只是使用的方式要更改而已。其他的想到在補 XD

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei