thinkphp6 事件的理解

php 2年前 (2022) PPK
1,545 0

事件就是把一些要做的事封装起来,哪里要用就去调用这个事件
事件类不用生成也能触发(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;
	  }
    }
}

 

版权声明:PPK 发表于 2022-04-06 20:45:38。
转载请注明:thinkphp6 事件的理解 | 襄音导航