Dcr163的博客 - thinkphp
type: channel
link: http://dcr163.cn/tag/thinkphp/
items: Thinkphp框架中的钩子与行为

Thinkphp框架中的钩子与行为
type: item
date: 2021-11-29T17:16:43+08:00
description: Thinkphp框架中的钩子与行为笔记官方说明ThinkPHP中的行为是一个比较抽象的概念，你可以把行为想象成在应用执行过程中的一个动作。在框架的执行流程中，例如路由检测是一个行为，静态缓存是一个行为，用户权限检测也是行为，大到业务逻辑，小到浏览器检测、多语言检测等等都可以当做是一个行为，甚至说你希望给你的网站用户的第一次访问弹出Hello，world！这些都可以看成是一种行为，把这些行为抽离出来的目的是为了让你无需改动框架和应用，而在外围通过扩展或者配置来改变或者增加一些功能。而不同的行为之间也具有位置共同性，比如，有些行为的作用位置都是在应用执行前，有些行为都是在模板输出之后，我们把这些行为发生作用的位置称之为钩子，当应用程序运行到这个钩子的时候，就会被拦截下来，统一执行相关的行为，类似于AOP编程中的“切面”的概念，给某一个钩子绑定相关行为就成了一种类AOP编程的思想。一个钩子可以注册多个行为，执行到某个钩子位置后，会按照注册的顺序依次执行相关的行为。但在某些特殊的情况下，你可以设置某个钩子只能执行一次行为，又或者你可以在一个钩子的某个行为中返回false来强制终止后续的行为执行；一个行为可以同时注册到多个不同的钩子上，完全看应用的需求来设计。下面上代码来理解文件目录结果如下图所示首先在behavior目录下新建一个Talk文件，这是定义了一个行为的控制器：<?php /** * Created by PhpStorm. * Author: Dcr163 * Date: 2021/11/29 * Time: 15:09 * 行为定义 */ namespace app\behavior; class Talk{ public function run($params){ dump($params); echo '我是Talk run默认行为 '; } public function sleep($params){ echo '我是Talk sleep 睡觉行为 '; } public function move(){ echo '我是Talk move 运动行为 '; } public function app_end(){ echo 'end '; } }在 index\controller\Index 控制器里添加钩子的信息，代码如下：<?php /** * Created by PhpStorm. * Author: Dcr163 * Date: 2021/11/29 * Time: 14:59 * 钩子与行为使用 */ namespace app\index\controller; use think\facade\Hook; class Mhook { function index() { Hook::add('talk', 'app\\behavior\\Talk', true); //首先注册一个标签，tag是自定义标签名，如果对应的行为类里有这个方法，则默认调用类里的方法，否则 调用run方法 Hook::add('sleep', 'app\\behavior\\Talk', true); //注册标签sleep 对应 app\behavior\Talk\sleep 方法，这里标签名一定要对应类里面的方法 Hook::add('move', 'app\\behavior\\Talk', true); //注册标签move 对应 app\behavior\Talk\move 方法，这里标签名一定要对应类里面的方法 echo 'Mhook Controller '; Hook::listen('talk',['id'=>11]); //触发调用方法 app\behavior\Talk\run()方法 Hook::listen('sleep'); //触发调用 app\behavior\Talk\sleep()方法 Hook::listen('move'); //触发调用 app\behavior\Talk\move()方法 echo 'Mhook Controller End'; } }其实就简单理解，首先在 behavior 目录下新建一个，行为文件，然后再 index\controller\Index 控制器里的方法 ，先注册，然后再调用就行了