作者TonyQ (自立而後立人)
看板PHP
标题Re: [请益] Codeigniter的糟糕之处?
时间Tue Apr 15 19:08:55 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/PHP/M.1397560138.A.285.html
1F:→ MOONRAKER:哈~我们都用一个很简单的lib,自动include主要的page 04/15 20:56
2F:→ MOONRAKER:这个页框可以另外维护,就跟masterpage一样 04/15 20:57
3F:→ MOONRAKER:session是乾脆用别人写的lib包装$_SESSION换掉他的 04/15 20:57
4F:推 amhuang:CodeIgniter 自从ellislab 丢出寻找新东家的讯息 04/15 22:22
5F:→ amhuang:就都没再更新了, 真希望能继续活下去 04/15 22:22
6F:推 DongFeng:PUSH 04/16 01:40
7F:→ alog:php framework太多了 真的会有人接手@.@? 04/16 18:52
8F:推 j87b0003:个人觉得ci真的很好用… 04/16 22:00
9F:→ herb123456:推荐你用Symfony2,你提的问题都解决了 04/23 15:05
10F:→ herb123456:我是没写过CI,但我猜他的缺点就是很多基本东西要自己来 04/23 15:06
11F:→ herb123456:我用Symfony2几乎都专注在核心演算法上 04/23 15:07
12F:→ herb123456:很多基本功能都做得好好的等我使用,很适合做快速开发 04/23 15:07
13F:→ TonyQ:不是解决问题就是好东西,Symfony2 对我还是太复杂了 04/24 23:09