1.参考

2.介绍

什么是事件?

  • 事件就是某些动作触发
  • 比如你的鼠标点击一次就触发了一次事件,这个事件最终不过是执行了一段代码而已,确切的说,是执行了一个函数

所以我们需要监听这个鼠标的点击事件,如果鼠标点击(也就是监听到了事件),那么这段代码就执行


3.准备

为了后面的演示,我们需要先定义一个路由
route\app.php

<?php
use think\facade\Route;
use think\facade\Db;

Route::get('test', function () {
    return 'hello';
});

接下来我们可以通过访问 /test 这个路由看到页面现实 hello


4.演示

  • 监听事件
  • 触发事件
  • 事件执行

在thinkphp也一样需要这三个步骤

4.1 事件监听

可以通过命令行快速生成一个事件监听类

php think make:listener Click

需要在think这个文件所在的目录下执行这条命令,出现Listener:app\listener\Click created successfully 字样说明命令执行成功,可在 app\listener目录下找到一个Click.php文件
该命令已经自动生成了一些代码

<?php
declare (strict_types = 1);

namespace app\listener;

class click
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //
    }
}

我们在handle函数中编写一句代码 echo "监听点击事件";

<?php
declare (strict_types = 1);

namespace app\listener;

class click
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        echo "监听点击事件";	// 我们编写的代码
    }
}

触发事件可以使用 event 函数来触发

event("click")

但是这个click事件到底是谁我们还没执行呢

4.2 事件触发

想要事件可以触发,那么就得让thinkphp知道这个click事件代表什么
找到 app\event.php 文件让click这个事件绑定刚才我们的类

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

    'listen'    => [
        'click'    =>    ['app\listener\Click'],    // 绑定
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [
    ],
];

更改前面我们定义的路由

Route::get('test', function () {
    event("click");
    return 'hello';
});

4.3 代码执行

**访问 /test
在这里插入图片描述

可以看到代码执行了

总结就是,定义一个监听事件的类,在这个类中有一个handle函数,绑定事件与类,触发事件时,执行handle函数

5. 事件订阅

可以通过事件订阅机制,在一个监听器中监听多个事件
什么意思呢? 大白话就是一个类执行触发一个事件太浪费了,每定义一个事件就要新建一个监听类,可能有些繁琐,事件订阅可以让多个事件存在于一个类
比如 click 事件 对应着 监听类中的 click方法

命令行快速生成一个事件订阅类

php think make:subscribe Test

生成的代码文件
app\subscribe\Test.php


<?php
declare (strict_types = 1);

namespace app\subscribe;

class Test
{
}

然后在事件定义文件注册事件订阅者
app\event.php


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

    'listen'    => [
        'click'    =>    ['app\listener\Click'],    // 绑定
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [
        'app\subscribe\Test',	// 注册事件订阅者
    ],
];


app\subscribe\Test.php

<?php
declare (strict_types = 1);

namespace app\subscribe;

class Test
{
    public function click_1(){
        echo "触发事件 click <br/>";
    }

    public function subscribe(\think\Event $event)
    {
        $event->listen('click_1', [$this,'click_1']);   // 绑定事件方法
    }
}

首先会执行 subscribe 方法,通过 $event->listen 进行事件与事件方法的绑定,也就是说每增加一个事件方法,就要使用 $event->listen 进行绑定
,我们再添加一个 move 事件

<?php
declare (strict_types = 1);

namespace app\subscribe;

class Test
{
    public function click_1(){
        echo "触发事件 click <br/>";
    }

    // 新增move事件
    public function move(){
        echo "触发事件 move <br/>";
    }

    public function subscribe(\think\Event $event)
    {
        $event->listen('click_1', [$this,'click_1']);   // 绑定事件方法
        $event->listen('move', [$this,'move']);   // 绑定新增的move事件
    }
}


路由文件,route\app.php

Route::get('test', function () {
    event("click_1");
    event("move");
    return 'hello';
});

结果

在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐