美文网首页
thinkphp6事件监听event-listene

thinkphp6事件监听event-listene

作者: 忘尘_f582 | 来源:发表于2022-04-15 12:30 被阅读0次

 

事件系统可以看成是行为系统的升级版,相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。

事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

步骤一:准备登录入口

首先准备一个登录入口 ,该入口本地的虚拟路由为 /api/login

class User extends BaseController

{

    public function login()

    {

        //执行登录操作

        echo "login_entrance\n" ;

        $user = \app\common\model\User::find(1)->toArray();

        //登录成功后的操作,比如可以分配邀请奖励,写入登录日志等

        echo "login_after\n";

    }

}

步骤二:创建事件

创建UserLoginAfterEvent事件,并在config/event.php配置文件中进行绑定

class UserLoginAfterEvent

{

    public $user;

    public function __construct($user)

    {

        $this->user = $user;

        echo "user_login_after_event\n";

    }

}

'bind'      => [

    'UserLoginAfter' => \app\common\event\UserLoginAfterEvent::class

],

然后在user/login 方法后面增加触发事件代码

public function login()

{

    //执行登录操作

    echo "login_entrance\n" ;

    $user = \app\common\model\User::find(1)->toArray();

    //登录成功后的操作,比如可以分配邀请奖励,写入登录日志等

    echo "login_after\n";

    /** 触发事件 */

    // 通过事件标识

    event("UserLoginAfter", $user);

    // 传入事件对象实例

    event(new UserLoginAfterEvent($user));

}

这时执行 /api/login 的输出结果如下:

login_entrance

login_after

user_login_after_event

经过验证 此时 使用事件标识触发 在UserLoginAfterEvent事件中 没有结果输出的。

步骤三:创建监听

创建事件监听类 UserLoginAfterListener.php,并在config/event.php配置文件中进行绑定

class UserLoginAfterListener

{

    public function handle($user)

    {

        // 事件监听处理

        echo "user_login_after_listener\n";

    }

}

'listen'    => [

    'UserLoginAfter' => [\app\common\listener\UserLoginAfterListener::class]

],

这时执行 /api/login 的输出结果如下:

login_entrance

login_after

user_login_after_listener

user_login_after_event

user_login_after_listener

另外在 UserLoginAfterListener 中打印 $user 的结果如下:

^ array:3 [  "id" => 1  "username" => "wangqy"  "password" => "123456"]

^ app\common\event\UserLoginAfterEvent {#88  +user: array:3 [    "id" => 1    "username" => "wangqy"    "password" => "123456"  ]}

结论

通过上述测试得出的结果如下:

1、使用事件标识来监听时 是不走定义的事件类的,只有在event方法中传入事件实例才能够在事件类进行操作值。

2、通过事件标识来监听时 ,在监听类中接受的值,是实际在触发事件时传入的参数,而通过事件类实例监听时,在监听类中拿到的是事件类实例。

注意:

在进行监听类绑定时,要注意标识后面的值是数组类型,使用下面这种方式,虽然没有报错,但是也不会生效。

'UserLoginAfter' => \app\common\listener\UserLoginAfterListener::class

参考链接:https://www.kancloud.cn/manual/thinkphp6_0/1037492

首发地址:http://upwqy.com/?p=405

相关文章

  • thinkphp6事件监听event-listene

    事件系统可以看成是行为系统的升级版,相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。...

  • Android之常用Listener监听器

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

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

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

  • 监听事件之Target-Action、协议代理

    监听事件:事件指点击,触摸这样的手势所引发的消息,监听事件即监听这类消息。监听事件的目的是处理这类消息。 监听产生...

  • unity 委托事件

    定义委托及事件 实现事件监听+=(事件取消监听为-=)

  • 37 高级:MVC

    课堂笔记 如何监听 的提交事件 为什么不监听click 事件?因为仅监听'click'事件时,便无法监听用户使用回...

  • spark 中的事件总线 ListenerBus

    事件监听模式一般需要定义3种组件:事件对象,事件源,事件监听器。在spark里面事件监听由ListenerBus组...

  • 下单流程解耦新方案-你知道Spring事件监听机制吗

    一、Spring事件监听介绍 Spring对事件监听是通过事件类型、事件类型监听和事件发布器3个部分来完成的 上面...

  • Java事件监听器的工作步骤介绍

    在程序开发中,经常需要对某些事件进行监听,如监听鼠标点击事件、监听键盘按下事件等,此时就需要使用事件监听器,事件监...

  • Linstener:监听器

    事件监听机制事件:一个事情事件源:时间发生的地方监听器:一段对象注册监听:将事件,事件源,监听器绑定在一起,当事件...

网友评论

      本文标题:thinkphp6事件监听event-listene

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