事件就是把一些要做的事封装起来,哪里要用就去调用这个事件
事件类不用生成也能触发(event);
事件监听:事件监听是一个一个生成的,一个事件监听负责一件事
事件订阅:事件订阅,一个类里面可以定义多个事件监听
定义事件订阅
// php think make:subscribe User
<?php
declare (strict_types = 1);
namespace app\subscribe;
class User{
public function onUserLogin($user) {
dump('2 监听UserLogin');
// UserLogin事件响应处理
}
public function onUserLogout($user) {
dump('3 监听UserLogout');
// UserLogout事件响应处理
}
}
定义事件监听
//创建一个监听类 php think make:listener UserLogin
<?php
declare (strict_types = 1);
namespace app\listener;
class UserLogin
{
/**
* 事件监听处理 / 依赖注入的方法
*
* @return mixed
*/
public function handle($event)
{
dump('1 listener监听');
//
}
}
<?php
namespace app\listener;
class User
{
//依赖注入的方法
public function handle(\app\event\User $event)
{
echo '4 listener监听得到:' . $event->login_event() . '<br>';
}
}
event.php
<?php
// 事件定义文件
return [
'bind' => [
// 'UserLogin' => 'app\event\UserLogin',
// 更多事件绑定
],
'listen' => [
'UserLogin' => ['app\listener\UserLogin'],
'UserLogout' => ['app\listener\UserLogout'],
// 更多事件监听
],
'subscribe' => [
'app\subscribe\User',
// 更多事件订阅
],
];
注:每生成一个事件监听类就要在event.php加一个listen;而事件订阅可以一个类里写多个事件监听
控制器中调用监听事件并触发
public function index(){
event('UserLogin');
event('UserLogout');
Event::listen('UserLogin', 'app\listener\UserLogin');
return View::fetch();
}
输出 >>
'listener监听'
'监听UserLogin'
'监听UserLogout'
<?php
namespace app\controller;
use think\facade\Event;
class Index
{
public function __construct(){
Event::listen('first', function($param){
echo $param . '+';
});
}
public function index()
{
event('first', 'first success');
return 0;
}
public function hellolisten($name = 'ThinkPHP6')
{
echo '1 hellolisten=' . $name;
//手动注册监听
Event::listen('UserListener','app\listener\User');
//直接使用事件类触发 监听事件
Event::trigger('UserListener');
//直接使用事件类触发 event.php 下的listen事件
Event::trigger('UserLogin');
Event::trigger('UserLogout');
}
}
<?php
namespace app\event;
//创建一个事件类 php think make:event User
class User
{
public function __construct()
{
echo '<br>2 User登陆事件构造函数<br>';
}
public function login_event()
{
echo '3 我是login_event<br>';
}
}
tips:事件中异常可以被主方法捕获
<?php
declare (strict_types = 1);
namespace app\subscribe;
class TestSub
{
public function onTestSub1(){
echo("testSub1");
$data = ['id' => '1', 'username' => 'haha1'];
\think\facade\Db::name('test')->save($data);
echo("testSub11");
}
public function onTestSub2(){
echo("testSub2");
$data = ['id' => '1', 'username' => 'haha1'];
//test1表并不存在
\think\facade\Db::name('test1')->save($data);
echo("testSub22");
}
}
<?php
namespace app\controller;
use think\facade\Event;
use think\facade\Db;
class Index
{
public function index()
{
Db::startTrans();
try {
event('TestSub1');
event('TestSub2');
// 提交事务
Db::commit();
return 111;
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
echo($e);
return 222;
}
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END