星期三, 十月 18, 2006

尝试写一个类似 RoR 的快速开发框架(2)

这两天又边看《Agile Web Development with Ruby》边写这个框架。开始着手处理URL到Controller的分配。虽然书上没有提到明确的URL处理流程,但看过几个程序之后大概的程序流程有点明白了。
RoR 通过 routes.rb 来定义自定义的 URL 影射规则,观察过 routes.rb、Cake、Django 的 URL 影射规则之后,我觉得在我这个框架里面最好的选择就是采用正则直接匹配。于是我可以考虑如下写法定义 routes.jsx:
Routing.connect('^/$', 'blog', 'index');
Routing.connect('^/articles/(\\d+)$, 'blog', 'show');

除了这个当然还有一个默认的规则,那就是根据url分割之后进行匹配:
/say/hello -> Controller: say, Method: hello
这样的 url 虽然没有经过 Routing 的定义,但是可以用默认的方式进行匹配,当然了,在hello后面的参数会追加到函数定义中去,譬如:
/say/hello/nicholas
function hello(greeting) { print(greeting); }
这种方式也应该要受到支持。

URL 的匹配还是挺复杂的一块内容,现在作了一个简陋的实现,还期待 ShiningRay 和 Tin 同学多提意见。

3 条评论:

Diamond Tin 说...

好像除了正则也没有什么好办法。但是这样的API不够OO,看看有没有简单些的封装。还有我觉得默认的映射能否按照/分割3、4……参数放到request的一个list里面,然后getParam(int)获取String。

Diamond Tin 说...

route.add(controller(""), method(""),delimiter("."),param... {param(1,"key1"),param(2,"key2")})
这样的映射就够了。
可以匹配/controller/method/key1.key2
route.add(controller(""), method(""),delimiter("/"),param... {param(1,"key1"),param(2,"key2")})
这样的映射就够了。
/controller/method/key1/key2

Nicholas @ Nirvana Studio 说...

我现在的规则是先匹配routers.jsx,然后自然拆分url,譬如/say/hello,我拆成controller=say,method=hello,如果后面还有就成为参数。

/say/hello/nicholas/2/3/4 =>
say.hello('nicholas', '2', '3', '4')