ThinkPPHP中的钩子和行为放在一起说,说因为他们两个是结合在一起用的,行为主要指的是我们需要执行的一些逻辑操作。下面列举一些常见的应用场景:
1、网站后台管理的每一个页面都需要进行身份和权限验证,这时候可以在项目中用一个钩子,在页面生命周期事件action_begin中插入一个事件用于执行验证行为。
2、当网站项目需要维护时,用户打开每一个页面显示维护信息,这时候可以在页面生命周期app_init中插入一个事件,显示维护信息和终止其他生命事件的执行。
3、加载一下公用的数据,只需要在action执行的事件之前加载数据,页面action操作时就可以直接使用数据。
4、页面执行完毕,进行一些临时的特殊的页面内容输出替换。可以在view_filter事件中操作。
5、对每一个页面做一些特殊的监控,可以在app_end或者response_end事件中加入操作逻辑。
除了以上列举的,还有很多应用场景。
如果不使用钩子,可以吗?答案是肯定的,除了用最笨的方法(在每一个操作前都加段代码)外,还可以定义一个基础控制器类,然后其他所有控制器都继承这个基础类,从而实现上诉功能。
但是钩子有个特别的地方是,代码是放在其他地方,管理方便,同时更加方便在每个生命周期插入事件,更加方便。
app_init 应用初始化标签位 无参数
app_dispatch 应用调度标签位 无参数
app_begin 应用开始标签位 无参数
module_init 模块初始化标签位 无参数
action_begin 控制器开始标签位 当前的callback参数
view_filter 视图输出过滤标签位 当前模板渲染输出内容
app_end 应用结束标签位 当前响应对象实例
log_write 日志write方法标签位 当前写入的日志信息
log_write_done 日志写入完成标签位
response_send 响应发送标签位 当前响应对象
response_end 输出结束标签位 当前响应对象实例
需要注意的是:其中log_write钩子仅在调用Log::write方法的时候执行。
view_filter钩子v5.1.3+版本中已经废除,改用视图类的filter方法过滤。
方维网络建议最好在在应用目录下面或者模块的目录下面定义tags.php文件来统一定义行为,因为这种网站架构最清晰,如果通过Hook在页面位置绑定,有些是操作不到,如app_init、app_begin等。
如下定义事件示例如下
return [
// 应用初始化
'app_init' => [
'app\\test\\behavior\\AppInit'
],
// 应用开始
'app_begin' => [
'app\\test\\behavior\\AppBegin'
],
// 模块初始化
'module_init' => [
'app\\test\\behavior\\ModuleInit'
],
// 操作开始执行
'action_begin' => [
'app\\test\\behavior\\ActionBegin'
],
// 视图内容过滤
'view_filter' => [
'app\\test\\behavior\\ViewFilter'
],
// 日志写入
'log_write' => [
'app\\test\\behavior\\LogWrite'
],
// 应用结束
'app_end' => [
'app\\test\\behavior\\AppEnd'
],
];
中间件是用于拦截或过滤应用的HTTP请求,并进行必要的业务处理,是5.1.16+才增加的功能,可以通过路由单独控制器定义,也可以全局定义,使用非常方便。
方维网络认为,用钩子、行为和中间件还是非常有必要使用,可以让你的系统架构更加灵活和优化。
方维网络专注于平台网站定制,各类网站定制,如果你有想法,我们跟你一起实现。