最近考慮休學去工作,所以面試了幾間公司。
在臺灣,大部份的 PHP 工程師都還是以維護 Legacy Code 為主(各種 PHP 5.2、5.3 的不升級,我就不說啦),而使用框架的部份幾乎都是以 CodeIgniter 為先(因為當初 CodeIgniter 出現得早,中文檔案齊全,很多臺灣的開發者都優先使用 CodeIgniter)
上禮拜五跑去面試了一間公司,薪資開得很誘人,環境也很舒適得宜,還有免治馬桶(這不是重點),缺點是使用 CodeIgniter Framework,而我並不熟悉這套 Framework。
簡介
CodeIgniter 是一套小巧但功能強大的 PHP 框架,做為一個簡單而“優雅”的工具包,它是一套專為 PHP 開發者建立功能完善的 Web 應用程式。如果你是一個使用虛擬主機,並且為客戶所要求的期限而煩惱的開發人員,如果你已經厭倦那些難而且效率不高的框架。--CodeIgniter 繁體中文官方檔案簡介
試用
原本我製作了一項專案叫做 OnlineRSA,這次就趁這個機會將其改寫為 OnlineRSA CodeIgniter。
幾乎所有的 PHP Code 都可以直接複製貼上,不用特別做任何更動(除了某些 Path 上的設定問題之外)。
至於前端的部份我使用了 async/await
、fetch
等 ES6/ES7 的 Featrue。
優勢
- 學習曲線低:只要會寫 PHP,基本上能在 1~2 小時內掌握 CodeIgniter 的基本功能
- 佈署簡單:佈署時不用打任何一行指令(如果你有使用 composer package 的話另當別論),甚至只要用壓縮檔丟到伺服器上解壓就能跑了。(該死,這版本控制絕對是一團漿糊…)
劣勢
- 沒有獨立的設定檔:如果使用 git,會把私有設定全部丟到版本控制中,因為它是集中設定,並沒有另外獨立的設定檔機制
- 命名紊亂:不遵守 PSR-2 與 PSR-4 的命名機制,導致在開發時非常的痛苦(對習慣現代化 PHP 工程師而言)
- 預設應用程式與根目錄位於相同層級資料夾:以致於每一個檔案開頭都會出現
defined('BASEPATH') OR exit('No direct script access allowed');
,以避免 client 直接存取該檔案,這在設計上是很糟糕的。 - 檔案清晰度不夠:有許多功能在檔案中描述相對凌亂(像是我看了很久,實在不知道
CI_Output
到底要怎麼用,最後還是用了header()
去設定 HTML Header
與 Laravel 的比較
- 學習曲線:Laravel 的學習曲線在眾 PHP Framework 中算是比較高的(當然比起 Symfony Framework,Laravel 更加友善,而且友善多了),尤其是要熟悉 CLI 操作
- 開發愉悅程度:Laravel 的開發上負擔較小,除了在依賴注入與反轉控制的部份會讓初學者很難理解之外,在大部份的定義上都很清晰讓人一目瞭然
- 佈署難度:CodeIgniter 佈署難度明顯較低,就算用了 composer package,在系統環境的要求上也比 Laravel 來得寬鬆
- View 的整合程度:Laravel 為了降低前端開發的門檻,建立了
Blade
模板引擎,而 CodeIgniter 則崇尚效率為先,所以預設使用純 PHP 檔案作為模板,但在可讀性層面明顯較差(註:CodeIgniter 也是可以用模板引擎的,不過要另外設定) - 測試:Laravel 在開發時期就很建議使用者多寫測試,在 Unit Test 跟 Feature Test 的整合也很優秀,甚至還有前端測試工具 Dusk 可以用;CodeIgniter 雖然也有整合 phpunit,但是預設是沒有安裝的,所以如果要用還需要另外自己建立相關環境,相較之下非常麻煩。
- model 意義:CodeIgniter 的 model 比較符合 Model2 的定義,Model 主要應該是拿來處理商業邏輯(包括但不限於 DB 存取),而在 Laravel 中,Model 比較偏資料庫存取(甚至 Model 就直接整合 Eloquent ORM),至於其它商業邏輯有部份初學者會寫在 Controller 中,比較進階一些的使用者會寫在 Service 中。
- 前端框架:CodeIgniter 並沒有限定需要使用什麼前端框架,自由度來說是很高的;Laravel 在前端框架的部份整合了 webpack,算是比較現代的前端開發流程。
- 第三方套件支援:Laravel 是使用 Service Provider 的方式去新增第三方套件,而 CodeIgniter 則是直接 include 第三方套件(也可以用 composer package),相較之下 Laravel 雖然易於管理,但是針對比較少用的 Package 就不太有人會去寫成 Service Provider(例如在這次我範例中使用的 phpseclib 就沒有 Laravel Service Provider 版本的),CodeIgniter 雖然容易擴充,但是擴充到最後絕對會是管理災難。
結論
嚴格來說,CodeIgniter 是銜接 Legacy PHP Code 到 Framework 的一個解決方案。
如果貴公司已經有一項營運一段時間的 Project 是用 Legacy PHP Code 寫成,不妨試試看用兩、三天的時候將其重構為 CodeIgniter 版本。
在 CodeIgniter 中再加強 unit test 與 feature test 的部份,作為未來跳到其它語言或框架的跳板。
不過我仍然覺得 CodeIgniter 相對其它較現化的 PHP Framework 來說是相當落伍的,如果你已經學會 Laravel,我也不建議再多學 CodeIgniter,太浪費時間了。