Event事件

1.框架内部事件

  • kernal.init
  • kernal.response
  • kernal.request
  • kernal.exception
  • kernal.notfound
  • kernal.httpfinish

2.自定义事件

  • 派发事件
    use EventDispatcher;

    EventDispatcher::dispatch('user.login');

    //你也可以在抛出事件时,塞入事件对象
    EventDispatcher::dispatch('user.register', new \Event($user));

    EventDispatcher::dispatch('user.register', new \UserEvent($user));
  • 事件对象Event与如何定义一个Event,例如:
<?php

namespace Group\Events;

final class HttpEvent extends \Event
{    
    protected $request;

    protected $response;

    public function __construct(\Request $request = null, $response = null)
    {    
        $this->request = $request;
        $this->response = $response;
    }

    public function getResponse()
    {
        return $this->response;
    }

    public function getRequest()
    {
        return $this->request;
    }
}

3.绑定监听单个事件的Listener

  • 在程序中绑定可以这样
    use EventDispatcher;

    $listener = new KernalResponseListener();
    //定义一个事件名称,触发的监听器,和一个重要指数
    EventDispatcher::addListener('kernal.responese', $listener, 10);

    EventDispatcher::removeListener('kernal.responese', $listener);

    EventDispatcher::hasListeners('kernal.responese');
  • 预先需要绑定的监听事件,可以编辑config/listener.php,添加预绑定事件的监听器
  • Listener对象与如何写一个监听Listener,下面给个例子
<?php

namespace src\Web\Listeners;

use Listener;
use Event;

class KernalResponseListener extends Listener
{   
    //设置执行的方法
    public function setMethod()
    {
        return 'onKernalResponse';
    }

    //触发时执行
    public function onKernalResponse(Event $event)
    {
        echo 'this is a KernalResponse Listener';
    }
}

4.绑定多个事件的Subscriber

  • Subscriber对象,例子:
    use Group\Events\EventSubscriberInterface;

    class TestSubscriber implements EventSubscriberInterface
    {   
        //注册多个监听事件
        public function getSubscribedEvents()
        {
            return [

                //eventName  =>  listener
                'test.start' => 'onTestStart',
                //eventName  =>  listener, priority
                'test.stop' => ['onTestStop', 100],
                //eventName  => array  listener, priority
                'test.doing' => [
                    ['onDoA'],
                    ['onDoB', 225],
                ],
            ];
        }

        public function onTestStart(\Event $event)
        {
            echo 'onTestStart';
        }

        public function onTestStop(\Event $event)
        {
            echo 'onTestStop';
        }

        public function onDoA(\Event $event)
        {
            echo 'onDoA';
        }

        public function onDoB(\Event $event)
        {
            echo 'onDoB';
        }
    }
  • 将Subscriber对象添加到EventDispatcher
        $subscriber = new TestSubscriber();

        EventDispatcher::addSubscriber($subscriber);

        EventDispatcher::hasListeners('test.start')
        EventDispatcher::hasListeners('test.stop')
        EventDispatcher::hasListeners('test.doing')

        EventDispatcher::dispatch('test.start');
        EventDispatcher::dispatch('test.stop');
        EventDispatcher::dispatch('test.doing');

        EventDispatcher::removeSubscriber($subscriber);

results matching ""

    No results matching ""