关于thinkphp6中事件的理解

上一篇文章转载了其他博主关于tp6事件的例子,下来说说自己对事件的理解

----------------------------------------------------------------------

按照thinkphp官方文档的解释,事件其实不用写event类,只需要写个监听类实现 handle() 方法,通过监听标示(event.php文件配置或动态添加监听)触发即可。

下面操作下这样的流程:

1.添加监听类

  可以命令: php think make:listener TestListen 其实就是建立一个类: 

<?php
namespace applistener;

class TestListener
{
    /**
     * 事件监听处理
     * @return mixed
     */
    public function handle()
    {
        echo "测试监听...执行";
    }
}

2.配置监听

在event.php 设置监听 (数组形式给定一个监听标示后边跟监听类数组)

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

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        // 更多事件监听
        'test' => ['applistenerTestListener'],
    ],

    'subscribe' => [
        // 更多事件订阅
    ],
];

3.触发事件

在控制器或其他业务里面触发

<?php
declare (strict_types = 1);
namespace appadminapicontrollerpc;

use thinkfacadeEvent;

class Index
{
    public function index()
    {
         //其他业务逻辑后下面要触发一个事件 
        Event::trigger('test');
        //return '您好!这是一个[pc--adminapi]示例应用';
    }

}

 用tp6的话大多情况下我们是这样用的.

=============================================================

借用一个事件的流程,我们下来使用事件类,在实现一个事件.

 下来想用thinkphp6来实现这个机制 (这次用到事件类)

分析下图片的流程:

我们可以定义一个: 打小孩事件类,然后触发这个事件,后监听类(监护人)执行处理方法.

1.创建打小孩事件 php think make:event HitChild

<?php
declare (strict_types = 1);
namespace appevent;
class HitChild
{
    public $evildoer;
    public function __construct($evildoer){
        $this->evildoer = $evildoer;
        echo $this->evildoer."打小孩<br>";
    }
}

2.创建监听类 php think make:listener ParentListener (监听类要实现 处理方法handle) 这里监听者和事件做一个绑定

<?php
declare (strict_types = 1);
namespace applistener;
class ParentListener
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle(appeventHitChild $event)
    {
        //
        echo "检测到".$event->evildoer."打我家小孩,我要报警!<br>";
    }
}

3.把事件绑定和事件监听配置到event.php文件中

<?php
// 事件定义文件
return [
    'bind'      => [
        'hitchild' => 'appeventHitChild',
        // 更多事件绑定
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        // 更多事件监听
        'test' => ['applistenerTestListener'],
        'hitchild' => ['applistenerParentListener'],
    ],

    'subscribe' => [
        // 更多事件订阅
    ],
];

4.控制器中触发事件

    public function hitchild(){

         //其他业务后,触发事件   
        Event::trigger(app()->make(appeventHitchild::class,["老王"]));
        return "controller--hitchild";
    }

 

 添加了事件类是不是可以把,事件触发者的信息 传递给 处理方法~~

参考:https://www.cnblogs.com/1693977889zz/p/8389058.html

 https://www.kancloud.cn/manual/thinkphp6_0/1037492

原文地址:https://www.cnblogs.com/fps2tao/p/15160662.html