Wednesday, 19 April 2006

Code Igniter 框架基本结构


Code Igniter框架,其基本结构是一个单一入点的PHP Web应用程序,入口:index.php。一个类似于Ruby On Rails的Web Application Framework。

在这个框架里,Web Developer需要做的事情:定义所需要的Routing,实现Controller,设计输出所需的View。

对于复杂应用,将数据结构从Controller中抽象出来成为Model。对于简单应用,使用db这一层数据接口就行了,Model不是必需的。Code Igniter从1.3.1开始才有单独Model目录。在Code Igniter中,Model不仅仅是指数据库table结构,还可以包括和数据相关的基本操作。因此有一部分Controller的Function可以move到Model里面,比如get、insert、update等等,这些只涉及到数据变更,不涉及View的细节性操作。这样可以进一步简化Controller。

Friday, 14 April 2006

Code Igniter的初步印象

在过去的一周时间里,断断续续地看着Code Igniter,总体感觉'Very Nice'。从Web所提供的Video Tutorial和Documents开始,渐进地完成第一个试验性的App,中间没有感觉到有太大的学习曲线。其中对PHP所作的些许变动,或者说简化,放在整个框架里,还是比较nature的,没有丝毫突兀的感觉。

App本身的文件都在application目录下,MVC分别占据各自独立的子目录,其它的如配置、自定义script、出错页面等也都相对独立。整体的目录结构还是非常清晰的。不过,也还是有改进的余地的,如果再增加一级目录,会更好些。这一点在Forum上已经有人提出了这个问题。估计框架本身的结构以后会有些变化,但这不会影响到App的目录结构。

Code Igniter所提供的文档,非常好。内容全面,结构清晰,语言简洁。相比其他文档来讲,多了一种享受的感觉。

对比前一阶段接触的Pylons,可以明显地感觉到Code Igniter没有Pylons那样超强的弹性。Code Igniter中,对URL、Model、Controller的命名、含义,Form数据处理流程,都有一些限制和要求。事实上,这些约束绝大部分是合理的、可取的,也是可以被开发者所理解和接受的。与其说是一种限制,还不如说是一种约定和习惯。好的习惯,对提高工作效率是有益的。

这篇访谈录中,提到了主要开发人员Rick Ellis的一些背景信息,音乐人、录音工程师、软件公司CEO。有点令人难以置信。再看看Code Igniter的网站,恐怕又要加上视觉艺术这一条了。很难想象,他是怎么这些不同领域的东西融合在一起的。

Monday, 10 April 2006

避免CI controller中的scaffolding出错

试着用CodeIgniter做了个简单的通讯录,基本上是跟着Video Tutorial的内容走。还是挺顺利的,遇到的问题是,在利用scaffolding的时候,update或insert数据的之后,回不到record list这个view。出错信息倒是很清楚,在redirect之前已经有内容被输出。检查下来的原因,是自己的controller文件在?>之后多加了一个空行。多余的空行,通常只是为了源文件书写得好看一些,更多时候是编辑时所遗留下来的。这在通常的编码过程中很常见,也不会有什么影响。不过在CodeIgniter现有的版本中,?>标识之后的内容会被输出到页面上,一旦需要修改header,redirect到其它路径,就会报错。这在PHP中是个常见的问题

对于这个问题,一个办法当然是保持Controller文件没有附加任何多余空格、空行;另外就是,server side打开php.ini中的output_buffering选项,使用输出缓冲以避免出现出错信息,但多余的空格、空行依然会被输出到页面上。

目前的感觉,Code Igniter还是蛮好用的,简洁、易上手,其附带的Document非常不错。当然,也提供了Video Demo教学。

Sunday, 9 April 2006

Code Igniter

Code Igniter,一个Ruby on Rails的PHP克隆。选择,往往是平衡之后的结果。PHP框架,很多是基于PHP 5,并且大量应用PEAR里的组件。在这些条件无法达到的情况下,Code Igniter,支持PHP 4、Lite、ROR like,这些特点对我来讲就显得比较合适。

真的合适吗?Let me try.

Friday, 7 April 2006

Typo3 4.0 Released

期待已久的Typo3 4.0终于发布了。又有新玩具了。

Monday, 3 April 2006

Cheat Sheet

Cheat Sheet,中文不知道该怎么翻译。字面意思“小纸条”,实际上就是“速记卡”。今天看到一个网站,收集了不少关于Web的Cheat Sheet。这对象我这种记性不好的人来讲,还是蛮有用的。

Sunday, 2 April 2006

Python Egg的形式

看过xpl223的prefix问题,今天想do something。在做了几个简单的测试之后,基本上把问题锁定在Routes上面。Routes,和其它的Python组件一样,是以Python Egg的形式安装在系统中的。

安装之后的Python Egg,有两种形式。一是.egg,一个完整的包文件;另外一种就是,egg展开之后的形式,通常单独建立一个子目录,目录名也是以.egg结尾的。Python Egg在安装以后,会在文件easy-install.pth里面注册。所谓的“注册”,其实也就是增加一行纪录,说明easy_install的包在那里。在easy-install.pth中,是看不出egg以那种形式存在的,具体的要看site-packages。事实上,egg的形式并不重要,两种方式都可以正常工作。

那为什么要有两种形式?包方式就很简单,为什么还要展开?我的理解,一些egg相对比较独立,和其它组件关联不大,或者它总是处于被调用的位置。这时候,包方式就比较简单。另外一些egg,属于容器类型的,比如Paste,本身是个框架,其它egg在安装的时候,会在此egg里放置一些代码。这种情况下,无疑需要将egg扩展开来才行。

回到最初的问题,Routes在安装后,还是egg包的形式,没有展开。而我需要对Routes进行debugging,那就只好自己手工展开了。egg包,采用的是比较普通的打包方法(pkzip?),用WinZip就可以打开,当然我自己喜欢用的是7Zip)。把原来的Routes-1.3-py2.4.egg改名,新建一个Routes-1.3-py2.4.egg目录,然后把egg包里东西extract到该目录中。重新启动Plons App,一切都依旧运行。不过这时候,就可以修改Routes的代码,增加调试信息,想怎么Hack都可以。

最后,xpl223的prefix问题锁定在site-packages/routes-Routes-1.3-py2.4.egg/routes/base.py中的class Mapper::_match函数。此段代码在增加了prefix选项后,只对第一个route进行match,然后就乱套了。看了看Route Trac上的代码,这个地方已经打了补丁。现在只要将Routes升级到最新版本,问题就解决了。