应用流程:'app_init'【应用初始化】-->'app_begin'【应用开始】-->'module_init'【模块初始化】--->[中间件执行【前置中间件】]--->'action_begin'【操作开始执行】--->['view_filter'【视图内容过滤】 | 'log_write'【日志写入】]-->[中间件执行【后置中间件】]--->'app_end'【应用结束】
先记住这个流程,是我自己理解的,[]:可选;【】:文字说明
应用走到那个步骤就执行那个步骤的行为类文件或者中间件文件
行为文件的定义:
<?php
/**
* Created by ahai
* Time: 2018/9/29 0029 上午 9:30
* Email: <764882431@qq.com>
*/
namespace app\admin\behavior;
use think\Request;
class Test
{
//引入jump类
//use \traits\controller\Jump;
//行为入口执行方法,
public function run(Request $request, $params)
{
//sleep(1);
// 行为逻辑
echo "<br/>";
//echo $request->path();
//echo "<br/>";
//echo $params;
//echo "<br/>";
echo "test行为:";echo microtime();
echo "<br/>";
// return $this->redirect("\login");
}
}行为入口方法run();-->就是入口执行方法这个名称可以修改
行为的入口方法名称支持自定义,如果需要更改在应用公共文件中添加下面的代码即可:
Hook::portal('portal');
入口方法名称就变成了portal。
这样一个行为文件就创建好了,接下来就是怎么让它实现的操作;
在应用目录下面或者模块的目录下面定义tags.php文件来统一定义行为:
<?php
//行为中有多个类时,执行顺序:从上到下
// 应用行为扩展定义文件
return [
// 应用初始化
'app_init'=> [
'app\\admin\\behavior\\Test',
'app\\admin\\behavior\\Check'
],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [
],
// 操作开始执行 【前置中间件在这个之前】
'action_begin' => [
],
// 视图内容过滤
'view_filter' => [
],
// 日志写入
'log_write' => [
],
// 应用结束【后置中间件在这个之前】
'app_end' => [
'app\\admin\\behavior\\Check'
],
];这样就可以了,当应用走到那个位置就执行那个行为根据官方说明,当行为中某个行为返回false时,后续行为不再执行,但是应用仍然继续执行,也就是说行为中出错只是不执行行为文件,应用继续执行
其他的整理说明:
下面这个行为例子,就是在同一个行为文件中写了不同的行为【这样理解同一个文件,写了两个不同的行为,而且只能在对应的行为上才执行对应的操作】
例子说明:在tags.php中加入了appInit,appEnd中加入这个行为文件
当执行了appInit 时就执行这个文件的appInit()方法,执行到appEnd时就执行appEnd()方法
namespace app\index\behavior;
class Test
{
public function appInit($params)
{
}
public function appEnd($params)
{
}
}行为的监听、执行:public function index()
{
echo "<br/>监听行为:Hook::Listen监听之前记得要先把行为注册,可以在tags.php中主册,也可以使用Hook::add()注册-----------------";
$params = 'ahai';
\Hook::add('app_init',['app\\admin\\behavior\\Check','app\\admin\\behavior\\Test']);
\Hook::listen('app_init',$params);
echo "<br/>直接执行行为文件【不管有没有注册,我就是执行行为文件】:-----------------";
\Hook::exec('app\\admin\\behavior\\Test',$params);
//return $this->fetch();
} 最佳答案