Thinkphp事件机制如何实现

发布时间:2022-09-22 09:43:17 作者:iii
来源:亿速云 阅读:137

这篇“Thinkphp事件机制如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Thinkphp事件机制如何实现”文章吧。

事件机制的实现有两种途径:通过监听、通过订阅

一、通过监听

1、创建监听类:在命令行模式下进入框架根目录执行

php think make:listener <自定义的类名>

例如:

php think make:listener UserListener

执行之后将在<框架根目录>\app\listener\下生成UserListener这个类。

2、配置监听:在<框架根目录>\app\event.php这个文件的listen数组中配置UserListener这个类,如下:

'listen'    => [
    'testEvent' => ['app\listener\UserListener']
],

3、触发监听:在你需要触发监听的地方加入如下代码

event('testEvent');

注意:这里的参数testEvent即为事件名称,可随便定义,但必须要与在event.php文件里配置的键名一致。

触发监听时你可以带上第二个参数。通过第二个参数你可以把任何数据传递到UserListener这个类中,也就是handle方法的参数(不明白啥意思的结合下面的完整代码理解)。

4、处理监听逻辑:在UserListener类的handle方法中完成业务逻辑

完整代码如下

Other:一个用来测试的类

<?php
namespace app\controller;
class Other
{
    public function hello()
    {
        echo 'hello function';
    }
}

Index:触发监听的类

<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
    public $name  = 'index';
    public function test1()
    {
        //触发监听事件,无参数
        event('testEvent');
    }
    public function test2()
    {
        //触发监听事件,传递字符串
        event('testEvent', 'hello');
    }
    public function test3()
    {
        //触发监听事件,传递自身类
        event('testEvent', $this);
    }
    public function test4()
    {
        //触发监听事件,传递其他类
        $other  = new Other();
        event('testEvent', $other);
    }
}

UserListener:事件监听类

<?php
namespace app\listener;
class UserListener
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //当调用Index类的test1方法时该代码有效,$event为null
        var_dump($event);
        //当调用Index类的test2方法时该代码有效,$event为字符串hello
        var_dump($event);
        //当调用Index类的test3方法时该代码有效,$event为Index类的实例
        //可以访问Index类的name变量
        echo $event->name;
        //当调用Index类的test4方法时该代码有效,$event为Other类的实例
        //可以调用Other类的hello方法
        echo $event->hello();
    }
}

二、通过订阅

1、创建订阅类

在命令行模式下进入框架根目录执行

php think make:subscribe <自定义的类名>

例如:

php think make:subscribe UserSubscribe

执行之后将在<框架根目录>\app\subscribe\下生成UserSubscribe这个类。

2、配置监听

在<框架根目录>\app\event.php这个文件的subscribe数组中配置UserSubscribe这个类,如下:

'subscribe' => ['app\subscribe\UserSubscribe'],

注意:为了测试效果,要把上面配置的UserListener从listen数组删除掉

3、触发监听

跟第一种途径一样

4、处理监听逻辑

处理监听的逻辑又有两种方法,我称之为自动绑定和手动绑定。手动绑定和自动绑定是互斥的,只能二选一。

4.1 自动绑定

在UserSubscribe类中添加ontestEvent方法,在该方法中完成业务逻辑。添加的方法名不能随意定义,规则是事件名称前面加上on。因为我们在event.php里定义的事件名称是testEvent,所以方法名就是ontestEvent(注意大小写)。监听方法定义之后就自动与事件绑定,所以我称之为自动绑定。

完整代码如下

Other和Index类的代码跟第一种途径一样

UserSubscribe:事件订阅类

<?php
namespace app\subscribe;
class UserSubscribe
{
    public function ontestEvent($user)
    {
        //当调用Index类的test1方法时该代码有效,$event为null
        var_dump($user);
        //当调用Index类的test2方法时该代码有效,$event为字符串hello
        var_dump($user);
        //当调用Index类的test3方法时该代码有效,$event为Index类的实例
        //可以访问Index类的name变量
        echo $user->name;
        //当调用Index类的test4方法时该代码有效,$event为Other类的实例
        //可以调用Other类的hello方法
        echo $user->hello();
    }
}
4.2 手动绑定

首先,创建事件类,负责处理具体的业务逻辑。在命令行模式下进入框架根目录执行:

php think make:event <自定义的类名>

例如:

php think make:event UserEvent

执行之后将在<框架根目录>\app\event\下生成UserEvent这个类。

再在该类中定义一个handle方法,该方法有一个传入参数。方法名和传入的参数名可以任意定义。具体的业务逻辑就可以放在handle方法里面处理。

然后,在UserSubscribe类中添加subscribe方法,该方法传入参数为 Event 对象。然后在该方法中将监听的事件绑定到UserEvent类的handle方法上。如下:

$event->listen('testEvent', [app('app\event\UserEvent'), 'handle']);

完整代码如下

Other和Index类的代码跟第一种途径一样

UserSubscribe:事件订阅类

<?php
declare (strict_types = 1);
namespace app\subscribe;
use think\Event;
class UserSubscribe
{
    public function subscribe(Event $event)
    {
        $event->listen('testEvent', [app('app\event\UserEvent'), 'handle']);
    }
}

UserEvent:事件处理类

<?php
declare (strict_types = 1);
namespace app\event;
class UserEvent
{
    public function handle($user)
    {
        //当调用Index类的test1方法时该代码有效,$user为null
        var_dump($user);
        //当调用Index类的test2方法时该代码有效,$user为字符串hello
        var_dump($user);
        //当调用Index类的test3方法时该代码有效,$user为Index类的实例
        //可以访问Index类的name变量
        echo $user->name;
        //当调用Index类的test4方法时该代码有效,$user为Other类的实例
        //可以调用Other类的hello方法
        echo $user->hello();
    }
}

以上就是关于“Thinkphp事件机制如何实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

推荐阅读:
  1. spring的事件机制实战
  2. thinkphp实现分页

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

thinkphp

上一篇:Go time包AddDate怎么使用

下一篇:php中怎么使用strtotime

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》