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
use Group\Events\EventSubscriberInterface;
class TestSubscriber implements EventSubscriberInterface
{
public function getSubscribedEvents()
{
return [
'test.start' => 'onTestStart',
'test.stop' => ['onTestStop', 100],
'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);