上一篇文章转载了其他博主关于tp6事件的例子,下来说说自己对事件的理解
----------------------------------------------------------------------
按照thinkphp官方文档的解释,事件其实不用写event类,只需要写个监听类实现 handle() 方法,通过监听标示(event.php文件配置或动态添加监听)触发即可。
下面操作下这样的流程:
1.添加监听类
可以命令: php think make:listener TestListen 其实就是建立一个类:
<?php namespace applistener; class TestListener { /** * 事件监听处理 * @return mixed */ public function handle() { echo "测试监听...执行"; } }
2.配置监听
在event.php 设置监听 (数组形式给定一个监听标示后边跟监听类数组)
<?php // 事件定义文件 return [ 'bind' => [ // 更多事件绑定 ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], // 更多事件监听 'test' => ['applistenerTestListener'], ], 'subscribe' => [ // 更多事件订阅 ], ];
3.触发事件
在控制器或其他业务里面触发
<?php declare (strict_types = 1); namespace appadminapicontrollerpc; use thinkfacadeEvent; class Index { public function index() { //其他业务逻辑后下面要触发一个事件 Event::trigger('test'); //return '您好!这是一个[pc--adminapi]示例应用'; } }
用tp6的话大多情况下我们是这样用的.
=============================================================
借用一个事件的流程,我们下来使用事件类,在实现一个事件.
下来想用thinkphp6来实现这个机制 (这次用到事件类)
分析下图片的流程:
我们可以定义一个: 打小孩事件类,然后触发这个事件,后监听类(监护人)执行处理方法.
1.创建打小孩事件 php think make:event HitChild
<?php declare (strict_types = 1); namespace appevent; class HitChild { public $evildoer; public function __construct($evildoer){ $this->evildoer = $evildoer; echo $this->evildoer."打小孩<br>"; } }
2.创建监听类 php think make:listener ParentListener (监听类要实现 处理方法handle) 这里监听者和事件做一个绑定
<?php declare (strict_types = 1); namespace applistener; class ParentListener { /** * 事件监听处理 * * @return mixed */ public function handle(appeventHitChild $event) { // echo "检测到".$event->evildoer."打我家小孩,我要报警!<br>"; } }
3.把事件绑定和事件监听配置到event.php文件中
<?php // 事件定义文件 return [ 'bind' => [ 'hitchild' => 'appeventHitChild', // 更多事件绑定 ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], // 更多事件监听 'test' => ['applistenerTestListener'], 'hitchild' => ['applistenerParentListener'], ], 'subscribe' => [ // 更多事件订阅 ], ];
4.控制器中触发事件
public function hitchild(){ //其他业务后,触发事件 Event::trigger(app()->make(appeventHitchild::class,["老王"])); return "controller--hitchild"; }
添加了事件类是不是可以把,事件触发者的信息 传递给 处理方法~~
参考:https://www.cnblogs.com/1693977889zz/p/8389058.html
https://www.kancloud.cn/manual/thinkphp6_0/1037492