phpcms2008 采用核心+模块的目录结构,新需求新功能只需以模块的形式加入便可,比如 comment 留言模块.
但如果一个模块只用于满足业务需求,与其它模块无关,不建立一套 API 让其它模块使用其功能,不提供一种形式让其它模块扩展其功能,则这样的的模块并不是[活]的,而是[死]的.
# search 模块
全文搜索模块,是典形的提供 API 让其它模块调用的功能模块,其它模块只要使用 search 模块的 API,就可以使用 search 模块的全文搜索功能,无需自己去开发.
# cms 模型字段
cms 模型类型字段定义文件在 /include/fields/ 中,原来的设计是都在 /include/fields/ 中,所以在此目录下可以看到如 brandid 这种属于 brand 模块的字段.
也就是说,所有模块如果想提供字段,都必须放在 /include/fields/ 目录中.
但更理想的结构应是,各模块提供的字段类型放在自己模块内部,向 cms 注册一下模块名,告诉 cms 哪些模块是提供字段的便可.
# api 与 callback
上面两个模块分别代表模块化的两个关键概念——api 与 callback.
api 就如全文搜索模块,此模块做好一个全文搜索功能,提供 api 让其它模块来使用自己的这个功能.
callback 就如模型字段,模型字段本身自成一套系统,但提供一组规则让其它模块扩展自己这个系统中的功能,这个关系就好比浏览器与插件,模型字段就是浏览器,其它模块提供的字段就像插件,插件扩展浏览器的功能.
一个模块同时有 api 与 callback 规则是非常正常的事.
# api
api 基本没什么规则,接口的好坏完全取决于 api 的设计者,在 cms 中的规定只有一条,其它模块通过调用目标模块 api 目录下定义的接口使用目标模块功能,禁止直接使用目标模块其它文件.
# callback
callback 属于扩展,需要一个规则,所有模块都遵守,使得模块间的扩展形式统一.
cms 中的 callback 规则很简单:所有对其它模块的扩展都存放于模块 callback 目录中,callback 目录中的规则由所扩展的模块确定.
下面用三个 callback 类模块作具体说明:
# pmque 模块
pmque 是队列模块.就是把需要执行的操作先保存入队列.然后一个一个慢慢执行,所以队列模块有两个概念:加入队列与执行操作.
于是 pmque 模块的 api 目录定义了加入队列的函数,供其它模块调用以实现加入队列的功能.
执行操作的基本实现形式就是回调,英文为 callback,队列中所有需要执行的操作都不是队列模块自己的代码,全是其它模块的代码,所以队列模块需要回调队列模块在执行队列时需要回调其它模块的代码.
所以,pmque 定义了一个简单的callback 规则:
1. 回调代码以函数形式定义.
2. 要使用队列的模块把回调函数定义在模块自己的 {mod}/callback/pmque.func.php 文件中.
执行操作包含两个基本的数据:所属模块与回调函数名.
eg.comment.commment_add_post_last
comment 是回调函数所在的模块,comment_add_post_last 是回调函数名,当队列模块取出这个执行操作时,就会包含 /comment/callback/pmque.func.php 文件并调用里面定义的 comment_add_post_last 函数.
这样,只要使用 pmque 模块的模块按 pmque 模块的 callback 规则在自己的 callback 目录写好需要的文件,就可以使用队列模块了.
而队列模块呢,只要设计好 callback 规则,就可以让所在已存在的,未存在的,未来开发的,模块提供队列功能.
# pcron 模块
cron 是 linux 下的计划任务程序,pcron 模块就是使用 php 实现的一个计划任务程序.
pcron 模块本身负责的是定时执行,实际要执行的代码都是其它模块的代码,因此用到的同样是 callback.
pcron 模块的 callback 规则就是:
1.使用 pcron 模块的模块,在自己模块目录中定义 {mod}/callback/pcron.callback.php 文件.
pcron 模块会按周期(如每分钟)包含这个文件(即执行),文件的编写形式及注意事项都由 pcron 模块决定.
也就是说,提供 callback 的模块决定 callback 的规则,使用 callback 的模块按所使用的模块 callback 规则定义.
比如 mail 模块需要定时发邮件,就按 pcron 模块的 callback 规则在自己模块目录中定义好对应的 callback 文件.
因为计划任务功能的特点,pcron 模块并不像 pmque 模块那样使用 api 添加队列,而是需要计划任务的模块定义好 callback 文件后,向 pcron 模块注册一下,pcron 模块会依次调用所注册模块的 callback 文件.
具体的实现就是注册的模块把模块名保存在一个文本文件中,一行一个.
# block 模块
block 模块提供 callback 让其它模块通过 callback 扩展 block 模块的功能,只要提供 callback 的模块都有自己的 callback 规则,其它模块要扩展时都需要查阅对应的 callback 规则,所以,把模块的 callback 规则以源代码的方式保存在模块目录内,查阅起来便很方便.
所以,有以下几条 callback 规则:
1.提供 callback 的模块本身提供的功能保存自己的 callback 目录下,以供其它模块查阅与参考.Vevb.com
比如 /block/callback/block/ 就是 block 模块本身提供的功能,其它模块可以参照此目录在自己模块目录 {mod}/callback/block/ 扩展 block 模块的功能.
2.若提供 callback 的模块本身不需要 callback,则也在 callback 目录中定义 callback 规则示例说明文件,比如:
/pmque/callback/pmque.func.php
/pcron/callback/pcron.callback.php
两个都是模块 callback 规则说明文件,供其它模块要查阅与参考.
3. 使用英文 example 表示 callback 示例规则,比如 block 模块本身定义有 callback 功能,所以使用 example 建立 callback 规则的示例说明文件:
/block/callback/block/data/example/
/block/callback/block/print/example/
通过以上三条规则,其它模块在扩展 callback 时就可以快速地找到 callback 规则的示例说明了.
# 结语
通过确定这样一种简单的 callback 目录规则,编写模块时遵守这个规则,便能实现模块间所乎无限的互相扩展.
新闻热点
疑难解答