发新话题
打印

ThinkPHP的插件机制

ThinkPHP的插件机制

ThinkPHP的插件机制参考了WordPress的插件实现,用途是为了简化核心类库、集中优化框架核心,便于扩展和替换框架功能。

本着这样的一个原则,ThinkPHP把早期内置的一些功能独立出来,作为插件方式提供。一方面是为了让框架核心类库更加容易维护,另外一方面也方便高级开发人员在不修改框架核心代码的情况下增强核心功能,而不用担心系统升级问题。当然,还有一个副作用就是提供了一些插件实现参考例子,呵呵~比较典型的插件例子就是官方的模版引擎插件和RBAC权限认证插件。

插件开发规范插件文件都是php文件,在文件开头必须添加注释,否则无效。注释标准兼容WordPress插件注释标准。格式如下:


其中Plugin Name必须,否则插件文件无效。目前的插件支持过滤插件、模块插件、操作插件和模版引擎插件。因为插件机制使用了Session功能,因此必须在开启SESSION后加载插件(模版引擎插件除外)

过滤插件使用add_filter方法添加过滤插件
add_filter($tag,$function,$priority = 10,$args = 1)
其中tag是系统定义的过滤器标签,可以由应用系统定义,框架本身也内置定义了一些标签。
function指定插件执行函数,可以支持类的方法调用方式。
priority指定插件加载优先级,
args可以指定插件方法需要传递的参数。

框架系统内置的过滤标签包括:

app_dispatch 应用程序调度过滤标签,是系统首先加载的插件
app_init 应用程序初始化过滤标签,在执行应用的exec方法之前执行
app_end 应用程序结束过滤标签,应用结束后执行(注意有些意外退出的应用可能执行不到,包括Ajax操作)
ob_init 页面输出缓存初始化过滤标签,在ob_start操作之前执行
ob_start 页面缓存过滤标签,在ob_start操作之后执行
template_file 模版名过滤标签,在调用模版引擎处理之前执行
template_var 模版变量过滤标签,在调用模版引擎输出之前执行
ob_content 页面输出过滤标签,在页面输出之前执行另外在ThinkTemplate模版引擎插件中还定义了tmpl_replace过滤标签 用于编译和解析模版删除过滤插件,使用remove_filter方法

在自己的应用开发过程中可以添加应用的过滤标签,在需要执行过滤插件的位置添加下面代码:
  • apply_filter('tagName',$str);


注意标签名称不要重复就行了,添加过滤器的方法一样使用。

模块插件
ThinkPHP支持通过插件的方式增加一个模块,模块插件添加后系统自动识别,外挂的模块优先程度低于内置模块,也就是说如果系统已经在存在一个模块,而插件方式也定义了一个同样的模块,那么内置模块有效,外挂模块不会被执行。
添加模块插件使用add_module方法
add_module($module,$class)
module表示模块名 class表示模块对应的类名,例如:
  • add_module('User','UserClass'); // 添加User插件模块



注意模块插件在执行的时候都是针对当前项目而言。同样使用remove_module删除模块插件
操作插件系统同样支持插件方式外挂操作,系统也是自动识别操作插件。
添加操作插件使用add_action方法
add_action($action,$function) action表示操作名,function表示对应的函数或者类的方法。action可以支持两种方式传值: 1、字符串 表示添加公共操作 add_action('sort','mySort'); //添加公共sort操作,任何模块都可以使用 2、数组方式表示添加指定模块的操作,例如
add_action(array('User','sort'),'mySort');// 给User模块添加sort操作
同样使用reomve_action删除操作插件

模版引擎插件添加模版引擎插件的方式有所区别,因为使用了SESSION保存插件数据,在测试的时候发现登出操作会清空SESSION数据,导致插件加载失败而不能显示登出提示信息(其实这个问题可以避免~为了兼容考虑,所有用另外的方式加载模版引擎插件)。使用add_compiler方法添加模版引擎插件:
add_compiler($tag,$compiler) tag是模版引擎名称 compiler是引擎方法,模版引擎插件定义后,系统会根据项目配置文件中定义的模版引擎名称来自动加载所需的模版引擎进行模版解析。
神迹兄~~好久不见鸟~~~

TOP

发新话题