關於thinkphp6中事件的理解


上一篇文章轉載了其他博主關於tp6事件的例子,下來說說自己對事件的理解

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

按照thinkphp官方文檔的解釋,事件其實不用寫event類,只需要寫個監聽類實現 handle() 方法,通過監聽標示(event.php文件配置或動態添加監聽)觸發即可。

下面操作下這樣的流程:

1.添加監聽類

  可以命令: php think make:listener TestListen 其實就是建立一個類: 

<?php
namespace app\listener;

class TestListener
{
    /**
     * 事件監聽處理
     * @return mixed
     */
    public function handle()
    {
        echo "測試監聽...執行";
    }
}

 

2.配置監聽

在event.php 設置監聽 (數組形式給定一個監聽標示后邊跟監聽類數組)

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

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        // 更多事件監聽
        'test' => ['app\listener\TestListener'],
    ],

    'subscribe' => [
        // 更多事件訂閱
    ],
];

 

3.觸發事件

在控制器或其他業務里面觸發

<?php
declare (strict_types = 1);
namespace app\adminapi\controller\pc;

use think\facade\Event;

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 app\event;
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 app\listener;
class ParentListener
{
    /**
     * 事件監聽處理
     *
     * @return mixed
     */
    public function handle(\app\event\HitChild $event)
    {
        //
        echo "檢測到".$event->evildoer."打我家小孩,我要報警!<br>";
    }
}

 

3.把事件綁定和事件監聽配置到event.php文件中

<?php
// 事件定義文件
return [
    'bind'      => [
        'hitchild' => 'app\event\HitChild',
        // 更多事件綁定
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        // 更多事件監聽
        'test' => ['app\listener\TestListener'],
        'hitchild' => ['app\listener\ParentListener'],
    ],

    'subscribe' => [
        // 更多事件訂閱
    ],
];

 

4.控制器中觸發事件

    public function hitchild(){

         //其他業務后,觸發事件   
        Event::trigger(app()->make(\app\event\Hitchild::class,["老王"]));
        return "controller--hitchild";
    }

 

 

 

 

 

 添加了事件類是不是可以把,事件觸發者的信息 傳遞給 處理方法~~

 

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM