CakePHP的坏味道_老王的技术手册 ( 我的新博客:http://huoding.com )_百度空间
CakePHP的坏味道2008年09月30日 星期二 下午 3:57
作者:老王
CakePHP成为PHP社区里最流行的框架,并不是因为CakePHP本身做得如何如何好,而是因为其他框架做得太差。CakePHP本身缺点多多,下面简要阐述一些CakePHP的坏味道:
* Route配置文件的膨胀
CakePHP的缺省实现中,我们并不用去设置Route,系统会遵循/controller/action/param的形式去解析URL。但是很多时候这样的URL并不友好,于是我们就要设置自定义的Route,其结果就是Route配置文件不断膨胀。值得注意的是PHP对于每个请求都要重建运行环境,而对于一次请求而言,Route配置文件里最后使用的只是一条配置而已,为了这一条配置,却不得不重复解析整个庞大的Route配置文件,无疑是个巨大的负担。REST风格是解决这个问题的好办法,采用REST风格的架构方式,资源的URL形式相对确定,操作方式由HTTP方法而定,因此Route配置文件会迅速瘦身,但是目前CakePHP的REST比较弱。
* Redirect中断控制器运行
CakePHP的redirect方法(redirect($url, $status = null, $exit = true))在CakePHP里被用来做跳转。乍一看起来这无可厚非,但是需要注意的是redirect方法执行之后会硬性的exit。不管你的脚本后面还有什么代码,都不会再被执行。这无疑是个大问题,先不说我们无法再使用装饰模式,至少程序的可测试性降低了。虽然可以用一些Hack方法来规避这个问题,但毕竟是旁门左道。合理的解决方式应该是创建一个Response对象,如果要重定向请求,无非就是给Response对象设置一个301/302,然后return,而不是exit,最后在前端控制器里完成真正的重定向。
* MVC划分不明确
CakePHP的MVC模型含糊不清。M依赖V:比如tree行为的generatetreelist方法,硬性的通过“_”符号来表现层次关系,实际上tree行为的generatetreelist方法就应该仅仅返回一个数据结构,至于用什么来体现层次关系,是V的事情。再比如model中的验证部分(error message)掺杂了i18n,实际上M不应该掺杂验证具体的错误信息是什么,取而代之的应该抛出一个验证异常,文字描述让V根据异常的具体类型去表述。C依赖V:在C里设置pageTitle,这明显是V的职责,还有当同时支持多种表现形式(html, json, xml)时,C里出现if/else的坏味道也证明了C依赖于V。
===============================================
后记:phrame,mojavi等早已绝迹的框架有死灰复燃的迹象。PHP框架的战国时代远未结束。