TP6 事件event与监听类listener

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

先上答案:

1. 假设有自定义的事件如aaa,在event.php文件中listen数组里,添加一项:键名为'aaa',键值为一个一维数组,里面是若干类名称如BB::class,CC:;class,DD::class。

2. BB,CC,DD 都有一个handle方法,在需要执行BB,CC,DD中handle方法的地方,写上Event::trigger('aaa')

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

再说原因:

事件的概念,可以理解为数组的一个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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352