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)分析和基本使用的更多相关文章

  1. LeetCode Algorithm 07_Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 click to ...

  2. 关于CoordinatorLayout与Behavior的一点分析

    Behavior是Android新出的Design库里新增的布局概念.Behavior只有是CoordinatorLayout的直接子View才有意义.可以为任何View添加一个Behavior.Be ...

  3. Thinkphp3分析与审计

    0x00 前言: 这篇是去年组内分享的时候给小伙伴写的0基础快速审计tp3系列的文章,主要是对架构做个分析以及审计一些sql注入漏洞~ 现在想想打算放出来,过了一年了,可能里面有一些问题,望看到的大佬 ...

  4. ThinkPHP3.2.3反序列化链子分析

    前言 目前官方已经不再维护ThinkPHP3.2.3,本文仅对ThinkPHP3.2.3反序列化链子进行复现,如有纰漏,还望指正. 环境介绍 MAMP pro PhpStorm Xdebug 利用条件 ...

  5. ThinkPHP3.1.3源码分析---php文件压缩zlib.output_compression 和 ob_gzhandler

    问题来源:\ThinkPHP3.1.3_full\ThinkPHP\Lib\Core\App.class.php 中 init()方法      if(C('OUTPUT_ENCODE')){     ...

  6. yii2 源码分析Behavior类分析 (四)

    Behavior类是所有事件类的基类,它继承自object类 Behavior类的前面注释描述大概意思: * Behavior类是所有事件类的基类 * * 一个行为可以用来增强现有组件的功能,而不需要 ...

  7. Thinkphp3.2.3 where注入 浅分析漏洞原理及修复

    0x01引子 0x02分析 找到截断方法 找到_parseType的入口 找到生成sql语句的代码 0x03 poc链 0x04 利用示范 payload: http://localhost:3000 ...

  8. ThinkPHP3.2 加载过程(四)

    前言: 由于比较懒散,但是又是有点强迫症,所以还是想继续把ThinkPHP3.2的加载过程这个烂尾楼补充完整. ========================================分割线= ...

  9. ThinkPHP- 3.1

    基础: 1. 基础概念 LAMP LAMP是基于Linux,Apache,MySQL和PHP的开放资源网络开发平台.这个术语来自欧洲,在那里这些程序常用来作为一种标准开发环境.名字来源于每个程序的第一 ...

随机推荐

  1. 开发简单的IO多路复用web框架

    自制web框架 1.核心IO多路复用部分 # -*- coding:utf-8 -*- import socket import select class Snow(): def __init__(s ...

  2. jenkins配置01--用户添加及权限配置

    原文出自:https://www.cnblogs.com/kevingrace/p/6019707.html 下面重点记录下jenkins安装后的一些配置: (1)添加用户权限 jenkins初次登陆 ...

  3. iOS 源代码混淆(初步混淆)

    我们可以用classdump对原程序进行 dump,像上篇文章( Class-dump 安装和使用记录(导出应用的头文件)),我们可以看到所有.h 文件全暴露了(如下图) 点击HWAccount.h后 ...

  4. css修改input自动提示的黄色背景

    css修改input自动提示的黄色背景 input:-webkit-autofill { background-color: #FAFFBD; background-image: none; -web ...

  5. springmvc 映射重复

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...

  6. struts2 jsp提交对象数据要这么干

    不要每个属性都 setter getter .. 这样页面很难看... 直接 把对象变成一个成员变量会比较好. Java code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  7. Software Defined Networking(Week 3, part 1)

    Control and Data Plane Seperation 课程地址 Overview 今天正式地学习一个控制与数据平面分离.学习完本节,应该要掌握何为控制和数据平面,了解它们的功能以及好处, ...

  8. windows下的C++ socket服务器(4)

    void handleAccept(int socket_fd) { ] = { '\0' }; string cmd; string filename; recv(socket_fd, buf, ) ...

  9. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  10. mac下搭建MySql环境基本步骤

    准备工作做完后,开始: 创建数据库 step1: 在mac中->系统偏好设置->最下边点MySQL 在弹出页面中 关闭mysql服务(点击stop mysql server) step2: ...