400-800-9385
网站建设资讯详细

平时网站项目采用thinkphp5.1有必要用钩子、行为和中间件吗?

发表日期:2018-08-12 09:42:55   作者来源:方维网络   浏览:7655   标签:网站项目制作    
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+才增加的功能,可以通过路由单独控制器定义,也可以全局定义,使用非常方便。
 

中间件定义



方维网络认为,用钩子、行为和中间件还是非常有必要使用,可以让你的系统架构更加灵活和优化。

方维网络专注于平台网站定制,各类网站定制,如果你有想法,我们跟你一起实现。
如没特殊注明,文章均为方维网络原创,转载请注明来自https://www.szfangwei.cn/news/4501.html