thinkphp6事件监听event-listener



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

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


发布时间 : 2023-03-01,阅读量:983
本文链接:https://upwqy.com/details/405.html
php如何设置session有效期 PHP 进阶的技术之路