##1. thinkphp系统执行流程 TP在从接受到HTTP请求到最终将视图输出,期间经历的不少步骤,这些步骤在在http://document.thinkphp.cn/manual_3_2.html#system_processphp
##2.行为扩展是什么 行为扩展
实际上就是在这系统执行流程些流程里埋下了一个钩子
,你能够往钩子里添加你本身的业务逻辑,当程序执行到某个钩子位置时将自动触发你的业务逻辑
.html
关于系统预置的一些钩子能够参考: http://document.thinkphp.cn/manual_3_2.html#behavior_extendthinkphp
##3.行为和插件 在thinkphp3.2里,有了一个插件的概念,和行为共用一个Hook类,原理上并没有太大区别。数组
##4. 行为扩展篇spa
TP内置行为钩子 咱们知道TP中预留了一些行为钩子,好比 action_begin,这个钩子是在动做开始执行时触发。插件
预置钩子注册行为类 预置的钩子你们经过配置文件注册行为类,你们在Application/Common/Conf目录下建立一个tags.php,返回一个数组,数组格式是code
"钩子名"=>array("行为类1","行为类2"......)htm
demo:图片
Application/Common/Conf/tag.php: <?php return array( "action_begin" => array("Behaviors\\test") ); ?>
能够看到,我往action_begin这个钩子里面注册了一个行为类,这个行为就是Behaviors\test 这里的写法是命名空间写法,其对应的类文件路径是:get
Application/Behaviors/testBehavior.class.php
注意实际类文件名须要加上Behavior后缀,以及用.class.php做为文件扩展名。
Application/Behaviors/testBehavior.class.php:
code
<?php namespace Behaviors; class testBehavior{ function run($arg){ echo "这是一个行为扩展".$arg; } } ?>
对于TP的自动加载机制,参考手册: http://document.thinkphp.cn/manual_3_2.html#autoload
行为的执行入口是 run()方法,触发钩子时会自动执行行为类里的run()方法。
##5动态添加钩子和注册行为
行为钩子添加和注册行为类,以及触发行为,都是经过Hook类来实现的,Hook类在TP核心包里的ThinkPHP目录下,Hook.class.php.
>>添加钩子以及注册行为:\Think\Hook::add('钩子名','行为') >>埋设/监听/触发钩子:\Think\Hook::listen('钩子名','传递给run的参数,必须是个变量');
假设咱们须要在访问index.php/Public/login.html的时候触发login钩子里的行为,那么首先咱们须要在login方法中监听钩子,也就是把钩子埋在login方法里,当访问login方法时就会自动触发,有点像猎人的陷阱不是吗?
监听钩子
function login(){ \Think\Hook::listen('login');//监听一个名为login的钩子 ...其余代码略... }
为钩子添加行为
好了,咱们在login方法里监听了login钩子,那么接下来咱们往这个钩子里添加一些行为,这样访问login的时候会自动触发这些行为,执行行为类的run方法。 行为在哪里注册呢?
注册行为
固然得在触发以前注册,
1.你能够经过tags.php注册,上面提到过了,只不过把action_begin换成login。
2.动态添加,假如你这个钩子只在Public控制器中使用,那么你能够在PublicController的_initialize()初始化方法中动态添加钩子。
function _initialize(){ \Think\Hook::add('login','Behaviors\\test'); } ``` 这里就往login这个钩子里添加了一个test行为,比较懒直接从上面复制过来了,你们理解这个意思就能够。 添加多个行为的话能够这样 ``` \Think\Hook::add('login',array('Behaviors\\test','Behaviors\\test1'...)); ``` 就是第二个参数变成一个数组,数组里每一个元素对应一个行为类,注意,当钩子被触发时,这里面的全部行为都会依次执行。 3.带参数的行为 上面咱们知道了行为是经过run()方法执行的,那么咱们想传递一些参数进去怎么办呢? 答案是 \Think\Hook::listen(); 的第二个参数。 注意listen方法定义以下: static public function listen($tag, &$params=NULL) 能够看到第二个参数是一个引用传递的参数,也就是说,第二个参数必须是一个变量,不能是值,下面的使用方法是错误的: \Think\Hook::listen('login',"hello"); // x 这样才是正确的 $hello = "hello"; \Think\Hook::listen('login',$hello);//√ 关于引用传递的知识这里不做介绍,请自行翻阅PHP手册。 这样咱们在行为类里面run方法能够指定一个参数来接收$hello function run($arg){ echo $arg;//输出 hello } 固然你也能够 function run(&$arg){ echo $arg;//输出hello $arg = "bye"; } 这样参数设定为引用类型,你能够在run里面改变原始变量的值。