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. 第24次Scrum会议(11/12)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/12 17:05~17:32,总计27min. 地 ...

  2. 软件工程-东北师大站-第九次作业(PSP)

    1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图

  3. java实验2实验报告(20135232王玥)

    实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解 ...

  4. Task 6.2冲刺会议十 /2015-5-23

    今天是第一个冲刺阶段的最后一天,主要把做出来的程序进行了初步的测试,在一台笔记本上运行程序,摄像头可以工作也能听到声音和麦克多的运转也还可以,两台计算机同时在一个局域网中通信的时候也可以实现.不过后续 ...

  5. mvc 路由配置-学习2

    public class RouteConfig {    public static void RegisterRoutes(RouteCollection routes)    {       r ...

  6. Head First Java & 重载 覆盖

  7. #Leetcode# 817. Linked List Components

    https://leetcode.com/problems/linked-list-components/ We are given head, the head node of a linked l ...

  8. Mscomm控件安装问题 License information for TMSComm not found.

    操作步骤: 1.打开delphi,菜单选择compoents->import Activex control,然后选择那个mscomm32.ocx安装即可. 2.注册MScomm控件   开始- ...

  9. C++中的栈内存和堆内存的区别

    数据结构中的堆与栈: 栈:是一种连续储存的数据结构,具有先进后出的性质.通常的操作有入栈(圧栈).出栈和栈顶元素.想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成.类比现实中的箱子一样. 堆 ...

  10. vue使用axios发送数据请求

    本文章是基于vue-cli脚手架下开发 1.安装 npm install axios --s npm install vue-axios --s 2.使用.在index.js中(渲染App组件的那个j ...