librelist archives

« back to archive

关于filter, filter chains, 与参数传递的问

关于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.