偶来说说ThinkPHP【插件】原理
时间:2009-04-02
来源:互联网
把TP的源码看了一遍,先把与插件有关的摘出来,大家分享,讨论一下。。。
(说下感受,感觉整个过程和Wordpress的插件机制还是很像的。。。)
1、首先说下,TP的插件是在哪个地方载入的
App.class.php
-
- private function loadPlugIn()
- {
- // 加载插件必须的函数
- include THINK_PATH.'/Common/plugin.php';
- //加载有效插件文件
- if(is_file(RUNTIME_PATH.'~plugins.php')) {
- include RUNTIME_PATH.'~plugins.php';
- }else{
- // 检查插件数据
- $common_plugins = get_plugins(THINK_PATH.'/PlugIns','Think');// 公共插件
- $app_plugins = get_plugins();// 项目插件
- // 合并插件数据
- $plugins = array_merge($common_plugins,$app_plugins);
- // 缓存插件数据
- $content = '';
- foreach($plugins as $key=>$file) {
- include $file;
- $content .= php_strip_whitespace($file);
- }
- file_put_contents(RUNTIME_PATH.'~plugins.php',$content);
- }
- return ;
- }
- include $val['file'];
2、把插件的函数名和参数个数放入SESSION中,就是这个函数了
- /**
- +----------------------------------------------------------
- * 动态添加过滤器
- +----------------------------------------------------------
- * @param string $tag 过滤器标签
- * @param string $function 过滤方法名
- * @param integer $priority 执行优先级
- * @param integer $args 参数
- +----------------------------------------------------------
- * @return boolean
- +----------------------------------------------------------
- */
- function add_filter($tag,$function,$priority = 10,$args = 1)
- {
- static $_filter = array();
- if ( isset($_filter[APP_NAME.'_'.$tag]["$priority"]) ) {
- foreach($_filter[APP_NAME.'_'.$tag]["$priority"] as $filter) {
- if ( $filter['function'] == $function ) {
- return true;
- }
- }
- }
- $_filter[APP_NAME.'_'.$tag]["$priority"][] = array('function'=> $function,'args'=> $args);
- $_SESSION['_filters'] = $_filter;
- return true;
- }
- array(6) {
- ["_filters"] => array(3) {
- ["Example_app_init"] => array(1) {
- [10] => array(2) {
- [0] => array(2) {
- ["function"] => string(9) "varFilter"
- ["args"] => int(1)
- }
- [1] => array(2) {
- ["function"] => string(14) "checkViewCache"
- ["args"] => int(1)
- }
- }
- }
- .........
通过session中的_filters对应的值,来查找函数,并执行
apply_filter('app_init');
- /**
- +----------------------------------------------------------
- * 执行过滤器
- +----------------------------------------------------------
- * @param string $tag 过滤器标签
- * @param string $string 参数
- +----------------------------------------------------------
- * @return boolean
- +----------------------------------------------------------
- */
- function apply_filter($tag,$string='')
- {
- if (!isset($_SESSION['_filters']) || !isset($_SESSION['_filters'][APP_NAME.'_'.$tag]) ) {
- return $string;
- }
- $_filter = $_SESSION['_filters'][APP_NAME.'_'.$tag];
- ksort($_filter);
- $args = array_slice(func_get_args(), 2);
- foreach ($_filter as $priority => $functions) {
- if ( !is_null($functions) ) {
- foreach($functions as $function) {
- if(is_callable($function['function'])) {
- $args = array_merge(array($string), $args);
- $string = call_user_func_array($function['function'],$args);
- }
- }
- }
- }
- return $string;
- }
如果你能看懂上面,我想写个插件应该不难了吧。。
我举个例子,大家参考下:
(1)在自己项目的Plugins目录下新建say.php,内容如下
- <?php
- function test ($con)
- {
- echo $con;
- }
- add_filter('Say','test');
- ?>
- 'THINK_PLUGIN_ON' =>true,
(3)调用
- public function index(){
- dump($_SESSION["_filters"]);
- apply_filter('Say',"hi");
- }
作者: fantasy 发布时间: 2009-04-02
作者: thinkcms 发布时间: 2009-04-02
作者: leon_studio 发布时间: 2009-04-03
作者: fantasy 发布时间: 2009-04-03
作者: 小坏虾 发布时间: 2009-04-04
作者: freebirdy 发布时间: 2009-04-04
作者: sunsmile 发布时间: 2009-07-01
作者: qq23154623 发布时间: 2009-08-17
作者: xmjlgh 发布时间: 2009-08-18
作者: 123133 发布时间: 2009-08-19
作者: cheseboy2000 发布时间: 2009-08-19
作者: eilf2 发布时间: 2009-08-19
oooO ↘┏━┓ ↙ Oooo
( 踩)→┃你┃ ←(死 )
\ ( →┃√┃ ← ) /
\_)↗┗━┛ ↖(_/
作者: aibangde 发布时间: 2009-08-20
作者: lcyhoho 发布时间: 2009-08-27
作者: xiaogg 发布时间: 2009-08-27
作者: jun708 发布时间: 2009-08-27
作者: steptt 发布时间: 2009-08-29
作者: mathsfox 发布时间: 2009-08-29
作者: imeagle 发布时间: 2010-03-01
作者: tomclub 发布时间: 2010-04-22
作者: whl1295a 发布时间: 2010-04-22
作者: jintingbo 发布时间: 2010-05-16
作者: lovemdb 发布时间: 2010-06-20
作者: diomen 发布时间: 2011-09-28
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28