TP6手册理解之架构·事件

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


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

官方文档东扯一句西扯一句,看到云里雾里完全不知道该怎么用,下面整理下网上查找到的事件用法资料

1、定义事件|自定义事件

事件可以单独写一个事件类,也可以监听的时候写匿名函数(匿名函数归到使用处再介绍)

# 命令行生成事件类
php think make:listener TestListener

TP6手册理解之架构·事件_第1张图片
编辑handle函数


declare (strict_types = 1);

namespace app\listener;

class TestListener
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        echo "这里是app/listener/testListener的handle
"
.PHP_EOL; } }

2、控制器中使用


<?php
namespace app\index\controller;

use think\Facade\Event;

class Test
{
    public function myListen()
    {
        // 匿名函数(这里是案例说明,一般匿名函数使用会写在base或initialize里供更多action使用)
        Event::listen('anonymous', function($param){
            echo '我是匿名函数事件,下面是我的参数param:';
            dump($param);
        });
        Event::trigger('anonymous','我是参数param'); // 使用Event的trigger触发事件


        // 类的使用(另外事件类除了Event::listen手动开启监听外,还可以修改event.php文件,添加事件监听)
        Event::listen('test', 'app\listener\TestListener');
        event('test'); // 使用助手函数触发事件

        return 'hello world!';
    }
}

TP6手册理解之架构·事件_第2张图片

3、修改event.php注册监听类

TP6手册理解之架构·事件_第3张图片
最终结果:
TP6手册理解之架构·事件_第4张图片

4、事件订阅

可以通过事件订阅机制,在一个监听器中监听多个事件
监听事件的方法命名规范是on+事件标识(驼峰命名),如果希望统一添加事件前缀标识,可以定义eventPrefix属性。

首先我们通过命令行生成一个订阅类 TestSub.php


declare (strict_types = 1);
 
namespace app\subscribe;
 
class TestSub
{
	protected $eventPrefix = 'User';

    public function onLogin($user)
    {
        // UserLogin事件响应处理
        echo '登录处理';
    }

    public function onLogout($user)
    {
        // UserLogout事件响应处理
        echo '退出处理';
    }

	public function subscribe(Event $event)
    {
        $event->listen('UserLogin', [$this,'onUserLogin']);
        $event->listen('UserLogout',[$this,'onUserLogout']);
    }
}

控制器调用


namespace app\controller;
 
use think\facade\Event;

class Index
{
    public function index()
    {
    	// event('UserLogin'); // 订阅也可以单独事件使用
    	// event('UserLogout'); 
    	Event::subscribe('app\subscribe\User'); // 订阅事件同时处理
        return 'hello world!';
    }
}

参考资料

  • TP6手册之事件
  • ThinkPHP6.0 event(事件)的使用方法

你可能感兴趣的:(thinkphp)