关于TP6的 事件,监听,订阅 理解

最近关于业务原因。要使用到TP6的事件,之前有个模糊的的概念。今天彻底的去看一下,按照官方文档来说

定义事件

事件系统使用了观察者模式,提供了解耦应用的更好方式

首先的话需要生成一个事件类可以使用官方命令生成

php think make:event UserLogin

运行之后就命令会生成app\evect\UserLogin.php 文件,作为事件类

生成后还要bind去绑定一下事件类在app\evevt.php,官方说可以更简洁,我试了一下确实

 [
        //当你没有在这里绑定的时候,那么你在控制器进行事件触发就需要
        //Event::trigger('UserLogin');  
        //但是如果你绑定了,那么就可以写成下面这样,控制器调用的时候可以写为
        //Event::trigger('U');
        //估计也就这样吧,具体的没去研究。
        'U' => 'UserLogin',
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [
    ],
];

因为只是测试就不做相关的模型操作,只做基本的输出看一下流程,所以写了一个方法echo一下

app\evect\UserLogin.php 

';
    }
}

 与此同时还要生成一个监听类,用来监听事件的业务逻辑,两者是相互结合的,用监听类来监听从而触发事件,以下命令会生成 app\listener\UserLogin 文件,作为监听类

php think make:listener UserLogin

创建后需要注册进行绑定,如果不绑定也可以进行动态注册,手动注册在控制器内写为

Event::listen('UserLogin','app\listener\UserLogin');
 [
        //当你没有在这里绑定的时候,那么你在控制器进行触发就需要
        //Event::trigger('UserLogin');  
        //但是如果你绑定了,那么就可以写成下面这样,控制器调用的时候可以写为
        //Event::trigger('U');
        //估计也就这样吧,具体的没去研究。
        'U' => 'UserLogin',
    ],

    'listen'    => [
        'UserLogin' => app\listener\UserLogin,
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [
    ],
];

 在此也做一个简单的echo输出

index();
        echo '已监听完成'.'
'; } }

再此就可以进行简单的测试了,创建一个控制器

接下来就是运行结果,这样就算完成了一个基本的事件类,可以根据你的业务需求进行调整

 可是如果有多个事件就会很麻烦,需要生成多个监听类进行监听触发,所以还有一种方式

订阅类

接下来说一下我对订阅类的简单理解

订阅类是可以在一个监听类监听多个事件

还是命令行生成一个在app\subscribe\User文件

php think make:subscribe User

生成之后不要忘记去app\event.php 进行绑定

 [
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [
        'app\subscribe\User',
    ],
];

当然也可以使用动态注册

//动态注册
Event::subscribe('app\subscribe\User');

也是做简单的输出

listen('Index',[$this,'onIndex']);
        $event->listen('Login',[$this,'onLogin']);
    }
}

 到这里订阅类就算是完成了,控制器调用订阅事件的时候使用以下方法

Event::trigger('Login');

运行结果为

 订阅类相比于监听类和事件类来说会省事一些,以上就是我对事件,监听,订阅的理解,如果有理解的错误的地方,还望指点

你可能感兴趣的:(tp6,php,php,开发语言,后端)