美文网首页
TP6 事件绑定、监听、订阅

TP6 事件绑定、监听、订阅

作者: 李子泥 | 来源:发表于2020-01-10 12:21 被阅读0次
    1. 事件绑定与监听
    • 命令行生成事件类 php think make:event EventDemo

    • 命令行生成事件监听类php think make:listener ListenerDemo

    事件类可作为保存与事件相关信息的容器,如没有额外需求可以不需要定义

    事件系统的所有操作都通过think\facade\Event类进行静态调用

    • 当定义事件类时
     // 在event.php中绑定事件标识
    'bind' => [
         'EventDemo' => \app\event\EventDemo::class
     ],
    // 一个事件可以有很多不相关的监听器   
    'listen' => [
       'EventDemo' => [
           \app\listener\ListenerDemoA::class,
           \app\listener\ListenerDemoB::class
       ]
    ],
    
    // 或者可以这样动态绑定
    Event::bind(['EventDemo' => \app\event\EventDemo::class]);
    
    // 以下方式都可以触发事件
    Event::trigger('EventDemo');
    Event::trigger(\app\event\EventDemo::class);
    Event::trigger(new \app\event\EventDemo('EventDemo 初始化'));
    
    
    • 不定义事件类时
    'bind' => [
         
     ],
    
    'listen' => [
       'EventDemo' => [
           \app\listener\ListenerDemoA::class,
           \app\listener\ListenerDemoB::class
       ]
    ],
    
    // 以下方式触发事件
    Event::trigger('EventDemo');
    

    此时就觉得bind比较多余,怎么说

     // 定义了事件类可以这样绑定
    'bind' => [
          
      ],
    
    'listen' => [
        \app\event\EventDemo::class => [
            \app\listener\ListenerDemoA::class,
            \app\listener\ListenerDemoB::class
        ]
    ]
    
    
    // 这样就可以触发事件
    Event::trigger(\app\event\EventDemo::class);
    Event::trigger(new \app\event\EventDemo('EventDemo 初始化'));
    
    // 这么看来bind的作用也只能体现在前面写到的那样了
    
    
    1. 事件订阅

    可以通过事件订阅机制,在一个监听器中监听多个事件

    命令行生成事件订阅者类php think make:subscribe SubscribeDemo

    订阅者类其实就是监听器的一个集合,在里面可以监听多个事件

    <?php
    declare (strict_types = 1);
    
    namespace app\subscribe;
    
    use think\Event;
    use think\facade\Log;
    
    class SubscribeDemo
    {
       /**
        * 命名规范是on + 事件标识(驼峰命名)
        */
       public function onEventInit($event)
       {
           // EventInit事件响应处理
           Log::info('EventInit事件响应处理');
       }
    
       public function eventEnd($event)
       {
           // EventEnd事件响应处理
           Log::info('EventEnd事件响应处理');
       }
    
       /**
        * 也可以通过subscribe方法来自定义事件标识注册事件监听器
        */
       public function subscribe(Event $event)
       {
           $event->listen('EventEnd',[$this,'eventEnd']);
       }
    
    }
    
    

    编写好事件订阅者类后在event.php中注册事件订阅者

    'subscribe'    =>    [
           \app\subscribe\SubscribeDemo::class,
            // 更多事件订阅
        ],
    

    或者动态注册

    Event::subscribe(\app\subscribe\SubscribeDemo::class);
    

    注册后就可以通过以下方式触发事件

    Event::trigger('EventInit');
    // 通过助手函数
    event('EventEnd');
    

    相关文章

      网友评论

          本文标题:TP6 事件绑定、监听、订阅

          本文链接:https://www.haomeiwen.com/subject/qrmpactx.html