thinkphp 6 事件 - 李老师转载

事件

  1. 事件和中间件有一点相似,只不过事件更加的精准定位更细腻的业务场景;
  2. 事件可定义:事件类、事件监听类、事件订阅类; 3. 我们先创建一个测试事件的类:TestEvent.php,手动创建一个测试类;
    public function __construct()
    {
        Event::listen('TestListen',function ($a){
           echo '监听器被处罚'.$a;
        });
    }
    public function info(){
        echo '登录前准备!';
        // Event::trigger('TestListen','ok');
        // Event::listen('abc',TestListen::class);
        // Event::trigger('abc','hdhdh');
        event('TestListen','测试233');
    }
  1. 我们也可以使用监听类来设计监听器,使用命令行创建;
php think make:listener TestListen
 	public function info(){
        echo '登录前准备!';
        // Event::trigger('TestListen','ok');
        Event::listen('abc',TestListen::class);
        // Event::trigger('abc','hdhdh');
        event('abc','滚吧');
    }
  1. 在 app/event.php 中,listen 是配置监听类的,配置方式如下:
<?php
// 事件定义文件
return [
    'bind'      => [
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        'TestListen'=>[\app\listener\TestListen::class]
    ],

    'subscribe' => [
        
    ],
];
  1. 而监听类被触发会自动执行 handle()方法,实现监听功能;
<?php
declare (strict_types = 1);

namespace app\listener;

class TestListen
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        echo '1111我是监听器哈哈哈哈!!!!'.$event;
    }
}

  1. 系统还内置了系统触发的事件,只要满足条件就会自动触发;
    在这里插入图片描述
    8.事件监听类,可以同时监听多个监听类,只要绑定到一个标识符即可;
TestListen'	=> [
	\app\listener\TestListen::class,
	\app\listener\TestOne::class,
	\app\listener\TestTwo::class
]

9.对于需要多个监听,监听类不够灵活,而且类会创建很多,可以使用订阅类;
10.订阅类就是将监听事件作为内部的方法用 on+方法名来实现;

php think make:subscribe UserSub
<?php
declare (strict_types = 1);

namespace app\subscribe;

class UserSub
{
    public function onUserLogin(){
        echo '登录监听';
    }

    public function onUserLogout(){
        echo '+退出监听';
    }

}

11.然后,我们直接去 app/event.php 注册一下;

<?php
// 事件定义文件
return [
    'bind'      => [
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        'TestListen'=>[\app\listener\TestListen::class]
    ],

    'subscribe' => [
        'UserSub'=> \app\subscribe\UserSub::class
    ],
];

12.然后,两个方法分别监听两个事件方法,直接调用方法名即可;

<?php
declare (strict_types = 1);

namespace app\controller;

use app\listener\TestListen;
use think\facade\Event;

class TestEvent
{
    public function __construct()
    {
        /*Event::listen('TestListen',function ($a){
           echo '监听器被处罚'.$a;
        });*/
    }

    public function info(){
        echo '登录前准备!';
        // Event::trigger('TestListen','ok');
        // Event::listen('abc',TestListen::class);
        // Event::trigger('abc','hdhdh');
        event('TestListen','滚吧');
    }

    public function login(){
        event('UserLogin'); //订阅类
    }

    public function logout(){
        event('UserLogout'); //订阅类
    }

}

13.对于事件类,很少有场景需要使用它,毕竟系统提供的各种精确方案较多;

php think make:event UserEvent
class UserEvent
{
	public function construct()
	{
		echo '我是事件类!';
	}
}
Event::trigger(new UserEvent());	
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值