【心得】CodeIgniter 與 Laravel 的比較

最近考慮休學去工作,所以面試了幾間公司。

在台灣,大部份的 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/awaitfetch 等 ES6/ES7 的 Featrue。

優勢

  1. 學習曲線低:只要會寫 PHP,基本上能在 1~2 小時內掌握 CodeIgniter 的基本功能
  2. 佈署簡單:佈署時不用打任何一行指令(如果你有使用 composer package 的話另當別論),甚至只要用壓縮檔丟到伺服器上解壓就能跑了。(該死,這版本控制絕對是一團漿糊…)

劣勢

  1. 沒有獨立的設定檔:如果使用 git,會把私有設定全部丟到版本控制中,因為它是集中設定,並沒有另外獨立的設定檔機制
  2. 命名紊亂:不遵守 PSR-2 與 PSR-4 的命名機制,導致在開發時非常的痛苦(對習慣現代化 PHP 工程師而言)
  3. 預設應用程式與根目錄位於相同層級資料夾:以致於每一個檔案開頭都會出現 defined('BASEPATH') OR exit('No direct script access allowed');,以避免 client 直接存取該檔案,這在設計上是很糟糕的。
  4. 文件清晰度不夠:有許多功能在文件中描述相對凌亂(像是我看了很久,實在不知道 CI_Output 到底要怎麼用,最後還是用了 header() 去設定 HTML Header

與 Laravel 的比較

  1. 學習曲線:Laravel 的學習曲線在眾 PHP Framework 中算是比較高的(當然比起 Symfony Framework,Laravel 更加友善,而且友善多了),尤其是要熟悉 CLI 操作
  2. 開發愉悅程度:Laravel 的開發上負擔較小,除了在依賴注入與反轉控制的部份會讓初學者很難理解之外,在大部份的定義上都很清晰讓人一目瞭然
  3. 佈署難度:CodeIgniter 佈署難度明顯較低,就算用了 composer package,在系統環境的要求上也比 Laravel 來得寬鬆
  4. View 的整合程度:Laravel 為了降低前端開發的門檻,創建了 Blade 模板引擎,而 CodeIgniter 則崇尚效率為先,所以預設使用純 PHP 檔案作為模板,但在可讀性層面明顯較差(註:CodeIgniter 也是可以用模板引擎的,不過要另外設定)
  5. 測試:Laravel 在開發時期就很建議使用者多寫測試,在 Unit Test 跟 Feature Test 的整合也很優秀,甚至還有前端測試工具 Dusk 可以用;CodeIgniter 雖然也有整合 phpunit,但是預設是沒有安裝的,所以如果要用還需要另外自己建立相關環境,相較之下非常麻煩。
  6. model 意義:CodeIgniter 的 model 比較符合 Model2 的定義,Model 主要應該是拿來處理商業邏輯(包括但不限於 DB 存取),而在 Laravel 中,Model 比較偏資料庫存取(甚至 Model 就直接整合 Eloquent ORM),至於其它商業邏輯有部份初學者會寫在 Controller 中,比較進階一些的使用者會寫在 Service 中。
  7. 前端框架:CodeIgniter 並沒有限定需要使用什麼前端框架,自由度來說是很高的;Laravel 在前端框架的部份整合了 webpack,算是比較現代的前端開發流程。
  8. 第三方套件支援: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,太浪費時間了。

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

Service Provider 写起来也很简单呀

2年前 评论
ChiVincent

@Chrisyes 其實這是個比較級,在 CodeIgniter 中要使用第三方套件的難度比 Laravel 做 Service Provider 來得簡單。

不過 Laravel 中也是能夠不通過 Service Provider 引用第三方套件,只是不太推薦就是了

2年前 评论

大陆维护老项目的人也挺多

2年前 评论
ChiVincent

@李曦赞 到哪都有維護老項目的人,但維護得好不好又是另外一個故事了

2年前 评论

维护老系统简直痛苦。
我还专门查了一下免治馬桶,用水洗吗?还是无法接受马桶

2年前 评论
ChiVincent

@MrJing 其實免治馬桶在表達的是對方的廁所很高級,我很喜歡而已,有沒有這個功能對我來說其實還好 XD。

2年前 评论

@ChiVincent 哦哦,原来是这个意思啊

2年前 评论
fatrbaby

我学习的第一个framework就是codeigniter,现在只喜欢laravel。

2年前 评论
Summer

我也跑去查了 『免治馬桶』 =_=, 就是会座垫加热,并且自动清洗 PP 的马桶。

2年前 评论

不接受公共马桶,不卫生;实在只有马桶的话我一般会在上面垫上一层卫生纸

2年前 评论
ChiVincent

@Summer @Tao

為什麼所有人的重點都在馬桶上啦 XDDDD

2年前 评论

习惯蹲着怎么办?

2年前 评论
ChiVincent

@开水养鱼

我記得他的廁所有三間,兩間是坐式的,一間是蹲式的

不過那天面試我走得有點太急,沒去看他們到底有幾間廁所

2年前 评论
Summer

@Tao
@开水养鱼 这样蹲着吗?

file

2年前 评论

谷歌免治马桶+1 :smile:

2年前 评论
godruoyi

这篇文章的主题是马桶哇!!:smile: :smile: :smile: :smile:

2年前 评论

喂喂喂,跑偏了。。。

2年前 评论

CI的历史包袱挺重的了,现在正在进行4.0的开发,然而和主流框架比起来,开发速度挺慢的。

2年前 评论

@BradStev 原来维护团队弃坑了,另外的公司接手重构,而且也不轻量了,好像是这样。

2年前 评论
nff93

搜索了一下免治馬桶,貌似确实挺高级的。。。

2年前 评论

@kylesean 好像是这个情况,如果想让使用者方便使用,基本会越来越远离轻量了

1年前 评论

重点跑偏了啊喂。逆袭的马桶。

1年前 评论

这个马桶很nice

1年前 评论

似乎。。所有人的注意力都到马桶上了XD

1年前 评论

有时候,用现代框架重构一个老项目比维护一个老项目的代码要简单的多。当然,如果项目系统庞大,当我没说过。

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!