美文网首页
TP6 事件event与监听类listener

TP6 事件event与监听类listener

作者: 李白龙 | 来源:发表于2020-10-06 10:52 被阅读0次

说明:TP6的官方文档很啰嗦,而且给出了若干并不良好的实践方式

----------------------------------------------------------------------------------------------------

事件的概念,可以理解为数组的一个key,该key对应多个函数。类似于['eventName' => ['fun1','fun2']]

监听就是一直“监视”某个事件是否完成(程序是否执行到标记位置),完成则执行若干函数,如上面的fun1和fun2。

触发,就是使事件变为完成,执行事件上所绑定的函数(监听器)。

即一个完整的事件监听流程分为: 定义事件,绑定监听器,触发事件三个部分。

一个典型的事件,就是浏览器的文档加载完毕。当文档加载完毕后,弹出广告,欢迎语之类的。

这里的事件是 document.ready,监听器是弹广告欢迎,触发动作是浏览器完成的,加载完文档就触发。

举一个常见的例子:填写表单,填写表单,注册完毕都是标记(事件,钩子), 注册完毕后,给新帐号增加金币,积分,登录次数。

这里的事件,就是注册完毕

这里的监听器,就是+金币,+积分,+次数三个功能。

事件触发就是,【注册完毕】这个事件发生了,执行上述三个功能。

上述场景在TP6中的实现方式是:

1. 定义一个事件register_ok

2. 将指定的类如AfterRegister绑定到register_ok事件,

绑定方法为:在app\event.php中的listen数组中添加:

return [

    'bind'    =>    [

    ],

    'listen'  =>    [

        // 事件名称为 register_ok,对应的监听类为AfterRegister

        'register_ok'    =>    ['app\listener\AfterRegister::class'],

    ],

];

3. 当register_ok触发时,执行AfterRegister中的方法(默认执行handle方法,在handle中去依次执行三个动作)

触发方式为:Event::trigger('register_ok',$user); 触发函数是可以传参的,如这里的$user,对应的AfterRegister中的handle方法,也具有对应的形参

class AfterRegister

{

function handle($user){... ...}

}

那么事件监听的实现方式,跟传统的函数调用有何优势?

事件使用场景一:

A,B,C三个人分别负责会员登录后增加金币,增加积分,增加登录次数记录的功能书写。

传统写法:

// 注册

。。。

// 注册完毕增加金币积分次数

addGold(); 

addScore(); 

addTimes();

很显然,此时如果三个人修改同一段代码必然导致冲突。

使用事件则可以如下方式完成:

①,约定事件名称为register_ok,分别绑定三个监听类(目的是将上例中AfterRegister中的handle方法中+金币+积分+次数拆开,分别放到AddGold,AddScore,AddTimes的handle函数中):

return [

    'bind'    =>    [

    ],

    'listen'  =>    [

        //  给register_ok事件,绑定三个监听类,分别为AddGold,AddScore,AddTimes

        'register_ok'    =>    ['app\listener\AddGold::class','app\listener\AddScore::class','app\listener\AddTimes::class']

    ],

];

②,在app\listener中加三个类,分别为AddGold,AddScore,AddTimes

③,在AddGold的handle方法中写增加金币的业务,AddScore的handle方法中写增加积分的业务,AddTimes的handle方法中写增加次数的业务

④,在注册代码的下方,加入事件触发,即用一个Event::trigger('register_ok',$user);取代了原本 addGold(); addScore(); addTimes();这种若干个函数的写法。

至此则完成了,N个监听类去监听一个事件的功能。或许有人说,传统写法一样可以用,三个人分别实现addGold(); addScore(); addTimes(); 就可以了,那么看下面这个场景

事件使用场景二:

某系统会员注册成功后,增加金币。

过了几周,要求增加金币的同时增加积分。

又过了几周,要求增加金币和积分的同时增加登录次数。

又过了几周,要求只增加金币和登录次数,不加积分了。

又过了几周,要求注册成功后增加金币和登录次数的同时,记录下会员的登录IP。

如果是使用传统方式,需要对源代码进行不断的修改和注释,事件则方便的多,只追加监听器和修改配置文件event.php,而不必改注册部分的业务代码。可见,事件监听的实现方式,在频繁出现业务变更的地方,有着传统方式不能比的优势。

---------------------------------------------------------------------------------------------------

后记:

1. TP6的文档中给出了事件类event的定义,实际中几乎没有使用的必要,徒增理解成本。

2. 对于事件的监听也给出了Event::listen的动态绑定方式,远不如在event.php中指定,更为方便和灵活可控。

3. 通常我们理解的绑定是 将监听器绑定到事件,这也是JS中的addEventListener的语义,TP6文档给出的绑定定义则是,将事件名称绑定到对应的事件类。

4. 基于以上三点,个人推荐采用 event.php配置文件进行监听, 用Event::trigger的方式进行触发事件,而不要用Event::bind和Event::listen。

相关文章

  • TP6 事件event与监听类listener

    说明:TP6的官方文档很啰嗦,而且给出了若干并不良好的实践方式 -------------------------...

  • 2021-09-22 GUI(事件监听机制)

    事件监听机制组成事件源(组件)事件(Event)监听器(Listener)事件处理(引发事件后处理方式) 事件监听...

  • TP6 事件绑定、监听、订阅

    事件绑定与监听 命令行生成事件类php think make:event EventDemo 命令行生成事件监听类...

  • Android之常用Listener监听器

    常用Listener监听器 ListView事件监听: EditText事件监听: RadioGroup事件监听:...

  • 5.4Laravel事件

    事件 更多详细请参看laravel手册 事件/监听器 事件类存放位置:app/Event 目录中 监听器存放位置:...

  • 监听器 Listener

    监听器 Listener 监听事件发生,在事件发生前后能够做出相应处理的 web 应用组件。 Listener实现...

  • Android事件处理机制

    一.基于监听的事件处理 在事件监听的处理模型中,主要涉及如下三类对象: Event Source(事件源):事件发...

  • common-lang3源码分析

    event包 EventUtils 事件绑定和监听的工具类 concurrent包 AtomicInitializ...

  • Flutter事件相关梳理(全网最全)

    监听屏幕触摸事件(Listener) PointerEvent(忽略事件) GestureDetector 手势点...

  • android事件处理学习笔记

    基于监听的事件处理 监听处理模型: Event Sourse(事件源) Event(事件):用户的一次操作会封装在...

网友评论

      本文标题:TP6 事件event与监听类listener

      本文链接:https://www.haomeiwen.com/subject/zkttpktx.html