以下方案缺少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越来越好。

关于yaf的控制器命名,一个纠结的问题(续)的更多相关文章

  1. extjs5 一个容器中有几个组件公用一个控制器和一个模型

    Ext.define('TestViewModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', // connects to v ...

  2. 1、控制器运行一个Process进程,等待不等待的问题

    一.区别 public static async void Execute(string para, string ffmpegPath, string timestr, string Id, str ...

  3. windows下重命名一个带有前缀"."dot字符的名字的错误问题

    如果用正常的右键重命名那么肯定会报错的,比如: 有一个名为project的文件,我想把它命名为.project,加了个前缀dot.然后window就报错了,弹出个对话框让“你必须输入一个文件名”.它可 ...

  4. mininet下建立拓扑时关于远程控制器的一个小问题

    最近重装了系统和mininet后,使用mininet时遇到了一点小问题,一开始忽视了细节,使得自己被这个问题困扰了好一会儿,好在后来还是发现了问题所在,故记录下来. $ sudo mn --topo ...

  5. android一个纠结的VFY错误

    08-16 09:06:45.018: W/dalvikvm(2286): VFY: unable to resolve static method 3273: Lorg/slf4j/LoggerFa ...

  6. SQL SERVER 表最小行的一个纠结问题

    昨天一个同事突然问我,说他在SQL 2000数据库创建如下表的时候,突然碰到了下面一条警告信息.SQL脚本和警告信息如下: IF OBJECT_ID(N'Log') IS  NULL BEGINCRE ...

  7. MVC控制器返回一个list 视图接收

    控制器 public ActionResult InfoFrame() { List<Users> list = new List<Users>(); if (Session[ ...

  8. 一个纠结的Linux定时任务

    昨天写了一个Linux定时任务,搞了半天才是搞好,现在分享下我犯得错误 首先在Linux根目录下创建一个目录 mkdir cat_crazy 进去创建一个shell脚本test.sh,内容是: #!/ ...

  9. 关于ID命名 一个页面唯一

    1.一般ID在一个区域内必须是唯一的.这样是一个规范而且在IE中使用JS通过ID获取这个对象永远只能获取第一个. 2.js无法找到重复的ID,用js获取时,只能得到第一个ID元素,但,如果不同的区域范 ...

随机推荐

  1. 0x3f3f3f3f...编程中无穷大常量的设置技巧

    转自 http://aikilis.tk/ 如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值. ...

  2. 引用 模块编译Makefile模板

    本文转载自geyingzhen<模块编译Makefile模板>   引用 geyingzhen 的 模块编译Makefile模板 ifneq ($(KERNELRELEASE), ) // ...

  3. android的fragments管理

    FragmentManager 为了管理Activity中的fragments,需要使用FragmentManager. 为了得到它,需要调用Activity中的getFragmentManager( ...

  4. 我的Python成长之路---第一天---Python基础(3)---2015年12月26日(雾霾)

    四.变量和常量 变量是用来存储程序运行期间需要临时保存可以不断改变的数据的标识符.Python有自身的内存回收机制,所以在开发过程中不用考虑变量的销毁等 Python中的变量名命名有如下规则: 1.变 ...

  5. 06-UIKit(tableView数据模型)

    目录: 一.UIPageControl 二.table view数据模型 三.反向传值给TableView并更新 回到顶部 一.UIPageControl在页面下显示点 1 重要属性 .numberO ...

  6. 小记:css特殊性

    今天早上遇到了个小bug,刚好用从css权威指南学到的知识解决了 html结构 <ul class="portlet-nav"> <li><a id= ...

  7. Android_简单笔记一

    入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...

  8. javascript笔记整理(流程控制)

    流程:就是程序代码的执行顺序 流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行 1.顺序结构(按照书写顺序来执行,是程序中最基本的流程结构) 2.选择结构(分支结构.条件结构):根据给定的 ...

  9. java调用restful webservice(转)

    一般来说,大家只会用到GET和POST方法来调用. GET方法的话,参数可以写在url里面. 比如说server的interface用的是@RequestParam或者@PathVariable,在客 ...

  10. MySQL推出Applier,可实时复制数据到Hadoop

    MySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从).试想一下,如果从服务器不再局限为一个MySQL服务器,而是其他任何数据库服务器或平台,并且复制事件 ...