0

0

详解ThinkPHP的行为扩展和插件

*文

*文

发布时间:2018-01-03 10:54:34

|

3607人浏览过

|

来源于php中文网

原创

本文主要介绍了ThinkPHP中的行为扩展和插件原理分析、ThinkPHP中的行为、自定义行为、自定义插件等,给大家提供参考,希望对大家有所帮助。

原理分析

将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静态变量$tags中。当执行Hook中静态方法listen或者exec方法的时候(listen方法中调用了exec),实例化标签对应的类,调用相应的方法(如果是插件,调用传递的方法,如果是行为,调用run方法)。
Hook中exec方法定义如下:

 static public function exec($name, $tag,&$params=NULL) {
        if(false === strpos($name,'\\')) {            // 插件(多个入口)
            $class   =  "Addons\\{$name}\\{$name}Addon";
        }else{            // 行为扩展(只有一个run入口方法)
            $class   =  $name.'Behavior';            $tag    =   'run';
        }        $addon   = new $class();        return $addon->$tag($params);
    }

   ThinkPHP中的行为    加载标签与类之间的对应关系

// 加载模式行为定义

睿拓智能网站系统-网上商城
睿拓智能网站系统-网上商城

睿拓智能网站系统-网上商城1.0免费版软件大小:5M运行环境:asp+access本版本是永州睿拓信息专为电子商务入门级用户开发的网上电子商城系统,拥有产品发布,新闻发布,在线下单等全部功能,并且正式商用用户可在线提供多个模板更换,可实现一般网店交易所有功能,是中小企业和个人开展个人独立电子商务商城最佳的选择,以下为详细功能介绍:1.最新产品-提供最新产品发布管理修改,和最新产品订单查看2.推荐产

下载
if(isset($mode['tags'])) {
    Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}// 加载应用行为定义if(is_file(CONF_PATH.'tags.php'))    // 允许应用增加开发模式配置定义
    Hook::import(include CONF_PATH.'tags.php');

模式行为对应关系

在ThinkPHP/Mode/common.php中tags标签中定义

'tags'  =>  array(        'app_begin'     =>  array(            'Behavior\ReadHtmlCache', // 读取静态缓存
        ),        'app_end'       =>  array(            'Behavior\ShowPageTrace', // 页面Trace显示
        ),        'view_parse'    =>  array(            'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
        ),        'template_filter'=> array(            'Behavior\ContentReplace', // 模板输出替换
        ),        'view_filter'   =>  array(            'Behavior\WriteHtmlCache', // 写入静态缓存
        ),
    )

应用行为对应关系

在Application/Common/Conf/tags.php中定义

立即学习PHP免费学习笔记(深入)”;

调用相应的行为

这里写图片描述

Hook::listen('app_begin')相当于调用Behavior\ReadHtmlCache中的run方法。找到该类,可以查看其对应的run方法如下
这里写图片描述

自定义行为    1.在Application/Common/Conf/tags.php中添加对应关系

'dqs_behavior'=>array('Common\Behavior\Dqs')

将对应关系添加到tags.php,程序会自动将其加载到Hook的$tags变量中,当然也可通过使用Hook中的add方法手动加载。

2.定义Common\Behavior\DqsBehavior类

';
        print_r('调用了行为Dqs');        echo '
';     } }

其中Behavior 类为ThinkPHP自带的抽象类

3.调用行为

这里写图片描述

效果如下图
这里写图片描述

自定义插件    1.定义插件文件

通过查看Hook文件中插件类实例化方式($class   =  "Addons\\{$name}\\{$name}Addon";),可以得知,如果想定义一个名为Dqs的插件,应该在Addons/Dqs目录下定义DqsAddon.class.php文件。程序如下:

'Editor',            'title'=>'dqs测试插件',            'description'=>'主要用于输出',            'status'=>1,            'author'=>'lidequan',            'version'=>'0.1'
    );    public  function dqsTrace($pa){
        echo '
';
        print_r($pa);        echo '
';     } }

   2.注册插件

所谓的注册插件,就是将插件的标签与类之间的对应关系,添加到Hook类中静态变量$tags中。对应行为来说,标识符仅仅是一个标识符,可以定义任意的标识符,但是对应插件来说,标识符不能随意定义,因为插件的标识符代表的是插件的方法名。所以上面的插件注册代码如下

\Think\Hook::add('dqsTrace',array('Dqs'));

   3.调用插件

$params=array('name'=>'dqs');
\Think\Hook::listen('dqsTrace',$params);

效果如下
这里写图片描述

原理分析

将标签与类之间的对应关系(如'app_init'=>array('Common\Behavior\InitHook')),通过Hook类中import或add方法,加载到Hook类中静态变量$tags中。当执行Hook中静态方法listen或者exec方法的时候(listen方法中调用了exec),实例化标签对应的类,调用相应的方法(如果是插件,调用传递的方法,如果是行为,调用run方法)。
Hook中exec方法定义如下:

 static public function exec($name, $tag,&$params=NULL) {
        if(false === strpos($name,'\\')) {            // 插件(多个入口)
            $class   =  "Addons\\{$name}\\{$name}Addon";
        }else{            // 行为扩展(只有一个run入口方法)
            $class   =  $name.'Behavior';            $tag    =   'run';
        }        $addon   = new $class();        return $addon->$tag($params);
    }

   ThinkPHP中的行为    加载标签与类之间的对应关系

// 加载模式行为定义

if(isset($mode['tags'])) {
    Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}// 加载应用行为定义if(is_file(CONF_PATH.'tags.php'))    // 允许应用增加开发模式配置定义
    Hook::import(include CONF_PATH.'tags.php');

模式行为对应关系

在ThinkPHP/Mode/common.php中tags标签中定义

'tags'  =>  array(        'app_begin'     =>  array(            'Behavior\ReadHtmlCache', // 读取静态缓存
        ),        'app_end'       =>  array(            'Behavior\ShowPageTrace', // 页面Trace显示
        ),        'view_parse'    =>  array(            'Behavior\ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
        ),        'template_filter'=> array(            'Behavior\ContentReplace', // 模板输出替换
        ),        'view_filter'   =>  array(            'Behavior\WriteHtmlCache', // 写入静态缓存
        ),
    )

应用行为对应关系

在Application/Common/Conf/tags.php中定义

立即学习PHP免费学习笔记(深入)”;

调用相应的行为

这里写图片描述

Hook::listen('app_begin')相当于调用Behavior\ReadHtmlCache中的run方法。找到该类,可以查看其对应的run方法如下
这里写图片描述

自定义行为    1.在Application/Common/Conf/tags.php中添加对应关系

'dqs_behavior'=>array('Common\Behavior\Dqs')

将对应关系添加到tags.php,程序会自动将其加载到Hook的$tags变量中,当然也可通过使用Hook中的add方法手动加载。

2.定义Common\Behavior\DqsBehavior类

';
        print_r('调用了行为Dqs');        echo '
';     } }

其中Behavior 类为ThinkPHP自带的抽象类

3.调用行为

这里写图片描述

效果如下图
这里写图片描述

自定义插件    1.定义插件文件

通过查看Hook文件中插件类实例化方式($class   =  "Addons\\{$name}\\{$name}Addon";),可以得知,如果想定义一个名为Dqs的插件,应该在Addons/Dqs目录下定义DqsAddon.class.php文件。程序如下:

'Editor',            'title'=>'dqs测试插件',            'description'=>'主要用于输出',            'status'=>1,            'author'=>'lidequan',            'version'=>'0.1'
    );    public  function dqsTrace($pa){
        echo '
';
        print_r($pa);        echo '
';     } }

   2.注册插件

所谓的注册插件,就是将插件的标签与类之间的对应关系,添加到Hook类中静态变量$tags中。对应行为来说,标识符仅仅是一个标识符,可以定义任意的标识符,但是对应插件来说,标识符不能随意定义,因为插件的标识符代表的是插件的方法名。所以上面的插件注册代码如下

\Think\Hook::add('dqsTrace',array('Dqs'));

   3.调用插件

$params=array('name'=>'dqs');
\Think\Hook::listen('dqsTrace',$params);

效果如下
这里写图片描述

相关推荐:

详解ThinkPHP如何实现生成和校验验证码

详解如何在云虚拟主机部署thinkphp5项目

thinkPHP5使用laypage分页插件实现列表分页功能_php实例

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2851

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1699

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1559

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1058

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1525

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1276

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1629

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1309

2023.11.13

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号