Re: [請益] Codeigniter的糟糕之處?
※ 引述《poopoo888888 (阿川)》之銘言:
: 小弟在公司用CI約莫半年
: 看到網路上對CI的批評很多
: 他過時、他不是OOP、他不是MVC
: 但都是一些大方向的描述 不夠明確
: 可以請教各位前輩的意見
: CI哪些地方很糟糕?哪些地方值得改進?
: 謝謝各位 小弟學了一個東西後就很想分析他的優缺點
: 我就先拋磚引玉了
: 在system/core的資料夾 有個Common.php檔
: 定義了CI一大堆的global function
: 但是global function跟global variable多了都是不好的
: 整理的不夠好、然後再到處用這些global function 簡直是硬幹
: 還有嗎?
: CI哪些地方很糟糕?哪些地方值得改進?
: 同步在SO發問
: http://stackoverflow.com/questions/23028540/bad-patterns-in-codeigniter
它最糟糕的點是 CI 團隊已經沒在維護他了,
但它我認為算是有 OOP 了,有類別能繼承能複寫是有什麼好不 OOP 的。
MVC ,他有 Model 有 controller 有 view ,看起來該有的也都有了。
我用了 CI 兩三年有了,一開始用就喜歡它,
開啟一個新專案只要幾分鐘不到一解就可以開始有最小單位的組合。
到目前為止就 php 而言,它還是我最喜歡的 framework。
(筆者寫過 JavaEE/.net MVC/rails,我想不是見識淺薄的緣故。)
我對 CI 的看法是它非常著重 Controller/Model,
也就是如果單純寫 controller/model ,你會覺得它考慮了很多事情。
像是 controller 加 function 等於加 routing 的 convention,
這點讓他變得非常好用。
對 lib 跟 helper 的切法也還算聰明,
就 lib 而言你只要對任何第三方的 lib 寫一隻 wrapper 就可以無痛整合。
就 helper 而言,也完全沒有負擔。
搭配 autoload 的機制更是世界變得輕鬆美好。
然後 remap 的機制更能讓你輕鬆做到最最基本的登入權限控管,
可以在真正碰到 controller 的 function 之前,
從源頭就一次檢驗是否有登入權限並做登入。
(跟rails 的 :before_action 或 JavaEE 的 filter 很像,非常好用。)
------------------------------------------
當然 CI 不是沒有缺點。
第一點是他的 session 機制非常難用,根本就是反直覺。
所以基本上我都是回頭用 $_SESSION 而不是用它內建的 session 。
第二點是它對於 view 的 helper 著墨的有點少,
form helper 其實並不好用,我基本上已經客製到有自己一套了。
第三點算是第二點的延伸,他沒有一個好用的 layout 系統。
一般來講很多 MVC 專案的模式都是會切 layout 跟 content 兩個 view,
layout 放一些 header/footer 的資料,content 則專注在處理特定頁面內容。
這點我是自己實作兩層的 $this->load->view() 來達到一樣的效果。
第四點,cache 機制很難用,
每次都在那邊寫 cache 有沒有 enable 的判斷式真的是會想殺人。
所以我把 model method 的 cache 自己加工過,讓他變得相對好用。
我寫了一個 MY_Model 裡面有這樣的 function
https://gist.github.com/tony1223/10722934
來達到我可以直接 cache 一個 model 的 function,
如果本來我 controller 是這樣寫
class UserModel extends MY_Model{
public function get_all(){
return $this->db->get("users");
}
}
$users = $this->UserModel->get_all();
我可以完全不用改 model 任何 code ,只改調用的地方,
就達到 cache 這個 function 傳回值的效果
//key,時間
$users = $this->UserModel->cache__get_all("cachekey_users",60);
不然原本是每個調用到 cache 的地方,
都要寫一次判斷 cache 在不在跟塞 cache 的作法,真的是會寫到想殺人。
(新一點有支援 closure 的 php 甚至可以不用跟 model 綁死了。)
(對了,cache 有一個作法是整 view 的,但我個人比較喜歡這種,
至少我可以隨時掌握我想 flush 哪個 key 跟要怎麼處理資料。)
最後一點是對於用 controller function name 當作 routing 這件事情,
讓 "new" 這個字只能透過寫 routes.php 來達成實在是有點機車。
基本上我覺得 CI 很忠實地呈現不找開發者麻煩的精神,
他沒有打算解決很廣大的問題,所以他沒有真的那麼包山包海,
也不會讓你覺得好像開使用之前要先弄懂很多很多的結構,就相對單純。
對於複雜的問題你得靠自己,
但如果你有能力自己加工,他還是一個很棒的基礎。
我覺得作為一個核心,小而迷你的 CI 總是比一些肥胖的 framework 好。
--
網頁上拉近距離的幫手 實現 GMail豐富應用的功臣
數也數不清的友善使用者體驗 這就是javascript
歡迎同好到 AJAX 板一同討論。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.168.132.30
※ 文章網址: http://www.ptt.cc/bbs/PHP/M.1397560138.A.285.html
→
04/15 20:56, , 1F
04/15 20:56, 1F
→
04/15 20:57, , 2F
04/15 20:57, 2F
→
04/15 20:57, , 3F
04/15 20:57, 3F
推
04/15 22:22, , 4F
04/15 22:22, 4F
→
04/15 22:22, , 5F
04/15 22:22, 5F
推
04/16 01:40, , 6F
04/16 01:40, 6F
→
04/16 18:52, , 7F
04/16 18:52, 7F
推
04/16 22:00, , 8F
04/16 22:00, 8F
→
04/23 15:05, , 9F
04/23 15:05, 9F
→
04/23 15:06, , 10F
04/23 15:06, 10F
→
04/23 15:07, , 11F
04/23 15:07, 11F
→
04/23 15:07, , 12F
04/23 15:07, 12F
→
04/24 23:09, , 13F
04/24 23:09, 13F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):