以下方案缺少loader相关的步骤,明天补上!!!

前面写过一篇《关于yaf的控制器命名,一个纠结的问题》。没想到yaf群里面也有跟我遇到一样问题的人,分享下解决办法。

写完那篇博文后,我尝试了多种思路,又是SPL又是配置的,历经了不少坎坷,但还是顺利的达成了我想要的目标。还是那句老话,办法总比困难多。下面,我介绍一下我的这个方案,不过这个方案的基本原理是修改yaf的源码重新编译,不喜欢这个方案的同学可以忽略本文了。

What

我们要达成什么样的目标?

1、修改yaf控制器的命名规范,如ZF一样:“控制器类名 = 模块名_控制器名Controller”,文件命名不变。

2、为了兼容以前缺省模块中的代码,在缺省模块中,控制器命名规则使用yaf默认的规则,即:“控制器类名 = 控制器名Controller”

How

how之前,我们有必要先弄清Why。

前面的文章里说过了,yaf之所以不支持根据模块名来区分控制器,是因为在yaf 的分发过程中对这些特定命名的类(或插件或模型)进行了特殊处理,并且处理中没有对这些类区分模块。比如:indexController 类,yaf在分发的时候,会实例化这个控制器,自然也就会想办法加载它,你可以在yaf_dispatcher.c中找到实例化控制器的函数,它叫做“yaf_dispatcher_get_controller”,并且被声明为:

zend_class_entry * yaf_dispatcher_get_controller(char *app_dir, char *module, char *controller, int len, int def_module TSRMLS_DC)

直观理解,传递app的目录,模块名、控制名、长度、默认控制器这些个参数,就可以了实例化控制器了。在这个函数中,实现了默认的控制器类命名规则:“控制器类名 = 控制器名Controller”(name_suffix默认值的情况下)。

好了,知道命名规则的实现原理了,我们就有的放矢地修改这个命名规则。写到这里我不禁感叹鸟哥V5啊,所有我们用到的参数都帮我们准备妥当了:除了控制器名、模块名居然还有缺省模块名!

万事具备,只欠东风:

在yaf_dispatcher.c中的yaf_dispatcher_get_controller函数中找到如下代码:

		if (YAF_G(name_suffix)) {
class_len = spprintf(&class, 0, "%s%s%s", controller, YAF_G(name_separator), "Controller");
} else {
class_len = spprintf(&class, 0, "%s%s%s", "Controller", YAF_G(name_separator), controller);
}

改为如下代码:

		if (YAF_G(name_suffix)) {
if (def_module){
class_len = spprintf(&class, 0, "%s%s%s", controller, YAF_G(name_separator), "Controller");
}else{
class_len = spprintf(&class, 0, "%s%s%s%s%s", module, "_", controller, YAF_G(name_separator), "Controller");
}
} else {
if (def_module){
class_len = spprintf(&class, 0, "%s%s%s", "Controller", YAF_G(name_separator), controller);
}else{
class_len = spprintf(&class, 0, "%s%s%s%s%s", module, "_", "Controller", YAF_G(name_separator), controller);
}
}

代码的意思直白,不用多说,保存、重新make、目的达成!

亲测可用!O(∩_∩)O哈哈~

Think

整个过程中,总结了一下几个问题:

1、鸟哥的代码质量确实好

2、我的C语言功底确实烂

3、修改或编写C扩展,对于PHPer来说并不是想象的那么痛苦和困难,试着钻进去之后,你会发现:你爱PHP,你更爱C语言。

End

到目前为止,我还不了解鸟哥如此设计模块控制器命名规则的初衷,他有时间的话,一定找他问问明白。顺便向他推销一下文中所述的命名规则,毕竟像ZF靠拢一点的话,更容易拉ZF的粉丝过来用yaf。

另外在yaf的使用过程中,发现一个forward的问题,这个问题是:如果在控制器的init方法中forward,会导致apache或php-fpm的崩溃,抽空也研究一下。

祝yaf越来越好。

最新文章

  1. c#运算表达式
  2. [Nginx] - PHP+FPM相关的配置
  3. [转]全面理解Unity加载和内存管理
  4. struts2 CVE-2013-4316 S2-019 Dynamic method executions Vul
  5. Android开发--Layout元素
  6. UE用法
  7. List、ArrayList、Vector及map、HashTable、HashMap分别的区别
  8. using(){},Close(),Dispose()的区别
  9. uploadify上传控件使用
  10. C# for循环①护栏长度 ②广场砖面积 ③判断闰年平年
  11. 搜索suggestion
  12. Spring 完成自动注入(autowire)
  13. Machine Learning, Homework 9, Neural Nets
  14. liunx驱动----USB驱动
  15. 在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文
  16. 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码
  17. 《AngularJS开发下一代Web应用》读书笔记与感想
  18. 学习笔记:MySQL Big DELETEs 删除大量数据
  19. 解题:SPOJ 3734 Periodni
  20. 9:@RequestMapping 用法详解之地址映射

热门文章

  1. pay包注释(二)
  2. 基于visual Studio2013解决C语言竞赛题之0413同构数
  3. Permutations【python】
  4. 利用xshell密钥管理服务器远程登录+VIM dd命令操作之伤之再伤
  5. Hadoop SecondaryNameNode
  6. 高级UIKit-07(AVAudioPlayer)
  7. CSS鼠标样式
  8. Robot Framework与Web界面自动化测试学习笔记:简单例子
  9. JVM调优总结(四)-垃圾回收面临的问题
  10. JRE 和 JDK 的区别是什么?