博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yaf_dispatcher.c 的 yaf_dispatcher_fix_default函数
阅读量:6968 次
发布时间:2019-06-27

本文共 3824 字,大约阅读时间需要 12 分钟。

  hot3.png

前言

本小节主要是介绍yaf_dispatcher_fix_default函数的作用以及实现细节。

函数原型

static inline void yaf_dispatcher_fix_default(yaf_dispatcher_t *dispatcher, yaf_request_t *request)

该函数用于对module/controller/action三个值进行标准化处理。以便于后续对具体类文件进行检索定位。

处理逻辑

  • module先全部小写,然后首字母大写。
  • controller先全部小写,然后以'_'或'\'为分隔符首字母大写。
  • action全部小写

示例

  • 处理前:demo\index_sub\index
  • 处理后:Demo\Index_Sub\index

参数说明

  • yaf_dispatcher_t *dispatcher

    zval数据类型, Yaf_Dispatcher类实例。

  • yaf_request_t *request

    zval数据类型, Yaf_Reqeust_Http实例

具体代码

/** * 对module/controller/action做相应的大小写处理 * 处理逻辑如下 * 1) 从yaf_request_ce中读取出module, constorller, action * 2) 如果1)读取的参数为空或非字符类型, 则从yaf_dispatcher_ce中读取相应的default值 * 3) module的处理是先全部小写然后首字母大写 * 4) controller是先全部小写,然后依据'_'为分隔符做首字母大写处理, 例如 Index_sub => Index_Sub * 5) action的处理是全部小写 * 6) 以上处理完成后均将处理后的结果值回写yaf_request_ce对应的成员属性 */static inline void yaf_dispatcher_fix_default(yaf_dispatcher_t *dispatcher, yaf_request_t *request) /* {
{
{ */ { zval *module, *controller, *action; module = zend_read_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_MODULE), 1, NULL); action = zend_read_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_ACTION), 1, NULL); controller = zend_read_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_CONTROLLER), 1, NULL); // module先全部小写然后首字母大写 if (Z_TYPE_P(module) != IS_STRING || !Z_STRLEN_P(module)) { zval *default_module = zend_read_property(yaf_dispatcher_ce, dispatcher, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_MODULE), 1, NULL); zend_update_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_MODULE), default_module); } else { char *p = zend_str_tolower_dup(Z_STRVAL_P(module), Z_STRLEN_P(module)); *p = toupper(*p); zend_update_property_stringl(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_MODULE), p, Z_STRLEN_P(module)); efree(p); } // controller先全部小写然后以'_'或'\\'为界首字母大写, 例 index_sub => Index_Sub if (Z_TYPE_P(controller) != IS_STRING || !Z_STRLEN_P(controller)) { zval *default_controller = zend_read_property(yaf_dispatcher_ce, dispatcher, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_CONTROLLER), 1, NULL); zend_update_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_CONTROLLER), default_controller); } else { char *q, *p = zend_str_tolower_dup(Z_STRVAL_P(controller), Z_STRLEN_P(controller)); /** * Upper controller name * eg: Index_sub -> Index_Sub */ q = p; *q = toupper(*q); while (*q != '\0') { if (*q == '_' || *q == '\\') { if (*(q+1) != '\0') { *(q+1) = toupper(*(q+1)); q++; } } q++; } zend_update_property_stringl(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_CONTROLLER), p, Z_STRLEN_P(controller)); efree(p); } // action全部小写 if (Z_TYPE_P(action) != IS_STRING || !Z_STRLEN_P(action)) { zval *default_action = zend_read_property(yaf_dispatcher_ce, dispatcher, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_ACTION), 1, NULL); zend_update_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_ACTION), default_action); } else { char *p = zend_str_tolower_dup(Z_STRVAL_P(action), Z_STRLEN_P(action)); zend_update_property_stringl(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_ACTION), p, Z_STRLEN_P(action)); efree(p); }}/* }}} */

细节

在这里,需要注意一个细节, 就是controller的那段处理逻辑。在C语言中有两种定义字符串的方式

  1. 字符数组
  2. 字符串常量

两者的区别体现在

  1. 字符数组存储在全局数据区或栈区,有读取和写入的权限。
  2. 字符串常量存储在常量区,只有读取权限,没有写入权限。

那么在上述代码里是怎么实现的字符修改呢?为了理解上面的知识点,写段测试代码用于验证。如下

#include
#include
#include
int main() { const char *controller = "index_sub"; char *q, *p = strdup(controller); q = p; *q = toupper(*q); while (*q != '\0') { if (*q == '_') { if (*(q+1) != '\0') { *(q+1) = toupper(*(q+1)); q++; } } q++; } printf("%s\n", p); return 0;}

参考资料

转载于:https://my.oschina.net/stream/blog/738352

你可能感兴趣的文章
/usr/lib目录属性更改引发的蝴蝶效应
查看>>
OpenGL超级宝典笔记——颜色
查看>>
shell 命令学习
查看>>
DataURL与File,Blob,canvas对象之间的互相转换的Javascript
查看>>
布置阿里云
查看>>
【草稿】.net 中已经引用了dll,但是编译报错找不到类型或者命名空间
查看>>
Sublime Text 3注册码
查看>>
网站的宣传推广极为重要
查看>>
给Metro风格RSS阅读器加个搜索
查看>>
DNS显性+隐性URL转发原理
查看>>
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
查看>>
日常数据文件自动入hive数据库
查看>>
AMD CEO罗瑞德称将调整战略 应对市场变化
查看>>
python符号计算
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
L4 磁盘管理与实例演示
查看>>
Jfinal engin 集成shiro标签支持
查看>>
58同城的面试经历
查看>>
Linux下,Redis(四)Redis数据持久化
查看>>