关于filter, filter chains, 与参数传递的问
- From:
- Tang Daogang
- Date:
- 2011-08-23 @ 01:58
最近几天添加了filter系统,现在的设计如下:
1. 所有的handler现在默认依次接收3个参数web, req, extra_params。写成 local function
xxxxxx(web, req, extra_params)的形式;
2. 如果在写URL规则的时候,直接是 ['/some/url/'] = some_handler_func
的形式,则上述3个参数的前两个有真实的值,extra_params只是一张空表;
3. 如果在写URL规则的时候,是 ['/some/url/'] = { handler = some_handler_func, filters
= { 'filter1', 'filter2'} 的形式,则可以通过最后一个filter返回true,
extra_params这两个参数来向handler中传递这个额外参数,注意,返回的参数extra_params应该为一个table;
4. 每一个filter接收两个参数,passed_in_params, extra_params,写成 local function
some_filter(passedin,
extra)的形式,passedin是在filter引用描述的时候定义的,是一个字符串的列表,extra_params最开始(传入第一个filter)为空表。返回两个参数,boolean,
extra,其中,第一个为true或false,是必须的;第二个是可选的,如果有的话,应该是一个table;
5. fitler的上述输入输出,为filter chains的建立提供的完备的基础。在filter chains之间传递数据,以及在filter
chains和handler之间传递数据,都是用这个额外表参数extra_params实现的。extra_params就好像是一艘船,每到一个地方就可以驮一些东西上来,经过重重关卡,最终随水流把货物送到handler中去;
6. req和web的使用,由于这两个是全局变量,所以,尽量保持其只读,而不要往里面写东西;
7. handler在不需要extra_params参数时,可以不写参数,直接local function xxxx() 的形式。但建议把web,
req都写上,当需要用到第三个参数的时候,必须把3个参数都写上;
如上规则,实际上定义了一套非常灵活的体系,使得filter这种东西,可以完成很多事情,并且有累积性。
--
Nothing is impossible.