登录  /  注册
首页 > php框架 > ThinkPHP > 正文

Thinkphp事件机制如何实现

PHPz
发布: 2023-06-02 17:37:22
转载
757人浏览过

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

    一、通过监听

    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 &#39;hello function&#39;;
        }
    }
    登录后复制

    Index:触发监听的类

    登录后复制

    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 自动绑定

    完成业务逻辑的ontestEvent方法应该被添加到UserSubscribe类中。添加的方法名不能随意定义,规则是事件名称前面加上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(&#39;testEvent&#39;, [app(&#39;app\event\UserEvent&#39;), &#39;handle&#39;]);
    登录后复制

    完整代码如下

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

    UserSubscribe:事件订阅类

    登录后复制

    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事件机制如何实现的详细内容,更多请关注php中文网其它相关文章!

    智能AI问答
    PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
    相关标签:
    来源:亿速云网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    关于CSS思维导图的课件在哪? 课件
    凡人来自于2024-04-16 10:10:18
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习
    PHP中文网抖音号
    发现有趣的

    Copyright 2014-2024 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号