thinkphp3 行为(behavior)分析和基本使用
1. 名词解析
官方解析: 来自 http://document.thinkphp.cn/manual_3_2.html#behavior_extend
行为(Behavior)是一个比较抽象的概念,你可以想象成在应用执行过程中的一个动作或者处理,在框架的执行流程中,各个位置都可以有行为产生,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测、多语言检测等等都可以当做是一个行为,
甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看成是一种行为,行为的存在让你无需改动框架和应用,而在外围通过扩展或者配置来改变或者增加一些功能。 而不同的行为之间也具有位置共同性,比如,有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置称之为标签(位),当应用程序运行到这个标签的时候,就会被拦截下来,统一执行相关的行为,
类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。
1. 1 标签位置
1) 系统核心提供的标签位置包括下面几个(按照执行顺序排列):
app_init 应用初始化标签位
path_info PATH_INFO检测标签位
app_begin 应用开始标签位
action_name 操作方法名标签位
action_begin 控制器开始标签位
view_begin 视图输出开始标签位
view_parse 视图解析标签位
template_filter 模板内容解析标签位
view_filter 视图输出过滤标签位
view_end 视图输出结束标签位
action_end 控制器结束标签位
app_end 应用结束标签位
2) 自定义
行为定义: 通过{Common,Module}\Conf\tags.php配置文件定义,格式如下:
<?php
return array(
'action_begin'=>array('Home\\Behaviors\\test','Home\\Behaviors\\test1'),//一个标签位可以有多个行为,使用数组即可。
// 如果是3.2.1以上版本 则需要改成
'action_begin'=>array('Home\\Behaviors\\testBehavior','Home\\Behaviors\\test1Behavior')
);
开发人员还可以在应用中添加自己的应用标签。
比如在控制器的_initialize方法中:
\Think\Hook::add('action_begin','Home\\Behaviors\\test1');//同时添加多个行为,只要将第二个参数换成数组即可。
// 3.2.1以上版本 需要改成
// \Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');
1.2 触发
行为的触发: 只要在合适的地方通过以下代码
\Think\Hook::listen('标签名'[,参数]);
// 或者
// tag('标签名'[,参数]);
2. 使用场景
参考 1. 我们已经知道 行为 是类AOP编程的思想。除业务之外的操作,均可加入行为。比如日志,统计等。
3. 使用案例
3.1 全局或者模块登录校验
修改 tags.php
return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [
"Collection\Behavior\TestBehavior"
],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [
"\Behavior\AuthBehavior"
],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [], ];
Collection 是模块目录, Application/Collection/Behavior/TestBehavior 记录访问日志
<?php
namespace Collection\Behavior;
use Think/Log;
class TestBehavior {
public function run() {
Log::write("有人访问");
}
}
ThinkPHP\Library\Behavior\AuthBehavior 操作认证
<?php
namespace Behavior;
class AuthBehavior {
public function run() {
$session_id = basename(strtolower(__MODULE__).'_admin_id');
$authAdminId = session($session_id);
$login_url = __MODULE__ . '/Public/login';
preg_match("/(login|createVerify)/i", $_SERVER["REQUEST_URI"],$matches);
$is_login = ($matches && count($matches) > 0) ? true : false;
$is_get = ($_SERVER['REQUEST_METHOD'] == 'GET') ? true : false;
// var_dump($authAdminId, $is_get, $is_login);exit;
if (!$authAdminId && (!$is_login && $is_get)) {
$timestamp = I('get._');
if ($timestamp) {
// ajax
echo bjuiAjaxReturn(301, '请您先登录', '', '', '', true);
exit;
} else {
//
// $this->error('请您先登录', __MODULE__ . '/Public/login');
header('Content-type:text/html;charset=utf-8');
redirect($login_url, 2, '请您先登录');
}
}
}
}
------ 未完待续 ------
thinkphp3 行为(behavior)分析和基本使用的更多相关文章
- LeetCode Algorithm 07_Reverse Integer
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 click to ...
- 关于CoordinatorLayout与Behavior的一点分析
Behavior是Android新出的Design库里新增的布局概念.Behavior只有是CoordinatorLayout的直接子View才有意义.可以为任何View添加一个Behavior.Be ...
- Thinkphp3分析与审计
0x00 前言: 这篇是去年组内分享的时候给小伙伴写的0基础快速审计tp3系列的文章,主要是对架构做个分析以及审计一些sql注入漏洞~ 现在想想打算放出来,过了一年了,可能里面有一些问题,望看到的大佬 ...
- ThinkPHP3.2.3反序列化链子分析
前言 目前官方已经不再维护ThinkPHP3.2.3,本文仅对ThinkPHP3.2.3反序列化链子进行复现,如有纰漏,还望指正. 环境介绍 MAMP pro PhpStorm Xdebug 利用条件 ...
- ThinkPHP3.1.3源码分析---php文件压缩zlib.output_compression 和 ob_gzhandler
问题来源:\ThinkPHP3.1.3_full\ThinkPHP\Lib\Core\App.class.php 中 init()方法 if(C('OUTPUT_ENCODE')){ ...
- yii2 源码分析Behavior类分析 (四)
Behavior类是所有事件类的基类,它继承自object类 Behavior类的前面注释描述大概意思: * Behavior类是所有事件类的基类 * * 一个行为可以用来增强现有组件的功能,而不需要 ...
- Thinkphp3.2.3 where注入 浅分析漏洞原理及修复
0x01引子 0x02分析 找到截断方法 找到_parseType的入口 找到生成sql语句的代码 0x03 poc链 0x04 利用示范 payload: http://localhost:3000 ...
- ThinkPHP3.2 加载过程(四)
前言: 由于比较懒散,但是又是有点强迫症,所以还是想继续把ThinkPHP3.2的加载过程这个烂尾楼补充完整. ========================================分割线= ...
- ThinkPHP- 3.1
基础: 1. 基础概念 LAMP LAMP是基于Linux,Apache,MySQL和PHP的开放资源网络开发平台.这个术语来自欧洲,在那里这些程序常用来作为一种标准开发环境.名字来源于每个程序的第一 ...
随机推荐
- python基础_字符编码
字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...
- React Native 之 main.jsbundle生成方法
通过react-native init yooweiProject 生成的RN项目(版本基于0.57),目录结构如下 项目结构: 大家可以发现main.jsbundle 是红色的,不存在的,这个属于正 ...
- 第九次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- C++:new&delete
一.new的浅析 在C++中,new主要由三种形式:new operator.operator new和placement new • new operator new operator即一些C++书 ...
- C#和.net框架
第一章C#和.net框架 c#只是.net的一部分,.net不只包含C#.C#是一种程序语言,.net是一个框架/平台 C#和.NET框架 在.NET之前 20世纪90年代,微软平台多数程序员使用VB ...
- 【转】 MATLAB下如何指定GPU资源
[转] MATLAB下如何指定GPU资源 原文链接
- 【贪心算法】POJ-1328 区间问题
一.题目 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, ...
- 用jar包运行带GUI的java游戏
这是从某论坛下载的java游戏demo,由于年代久远,所以没有记下出处.重要的是,这是一个带GUI的java程序. 链接: https://pan.baidu.com/s/1LjQ2bQPXvW-ti ...
- VirtualBox安装及Linux基本操作(操作系统实验一)
VirtualBox安装教程博客链接(转载)https://blog.csdn.net/u012732259/article/details/70172704 实验名称:Linux的基本操作 实验目的 ...
- (转)web开发流程
a.项目经理与公司决策层的沟通,以确定这个需求有没有足够的人手和可行性去实现,以及与现有产品的依存关系. b.公司决策层与市场/策划部门的交流,这个过程将进行的相当充分,并且是反复.长期的,它致力于从 ...