mepihindeveloper/php-event-dispatcher

v1.0.0 2022-02-22 07:59 UTC

This package is auto-updated.

Last update: 2024-09-22 13:46:17 UTC


README

release Packagist Version PHP Version Require license

build codecov

用于处理事件和监听者的组件

结构

src/
--- exceptions/
------ EventNotFoundException.php
------ ListenerNotFoundException
--- interfaces/
------ ListenerInterface.php
--- Event.php
--- EventDispatcher.php
--- ListenerProvider.php

interfaces目录中存储必要的接口,这些接口需要在实现自己的Listener类时实现。Listener类作为事件监听者,必须实现process方法。在exceptions目录中存储必要的异常。异常EventNotFoundException用于识别事件查找错误(当事件未找到时),同样ListenerNotFoundException也是如此。

Event类实现了事件本身。自定义事件应该继承自Event类。

EventDispatcher类实现了事件调度器,它通过ListenerProvider作为中介来工作。

ListenerProvider类实现了监听者提供者,其中进行所有与监听者和事件相关的操作。

事件和监听者的示例实现

<?php

declare(strict_types = 1);

use mepihindeveloper\components\Event;
use mepihindeveloper\components\EventDispatcher;
use mepihindeveloper\components\interfaces\ListenerInterface;
use mepihindeveloper\components\ListenerProvider;
use Psr\EventDispatcher\StoppableEventInterface;

require_once __DIR__ . '/vendor/autoload.php';

class Event1 extends Event { }

class Event2 extends Event { }

class Event1Listener1 implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

class Event2Listener1 implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

class Event2Listener2 implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

class AllEventsListener implements ListenerInterface {
	public function process(StoppableEventInterface $event) {
		echo "Я " . get_class($this) . " слушаю событие " . get_class($event) . PHP_EOL;
	}
}

$event1 = new Event1;
$event2 = new Event2;
$event1Listener1 = new Event1Listener1;
$event2Listener1 = new Event2Listener1;
$event2Listener2 = new Event2Listener2;
$allEventsListener = new AllEventsListener;

$listenerProvider = new ListenerProvider;
$listenerProvider
	->addListenerForEventType($event1Listener1, Event1::class)
	->addListenerForEventType($event2Listener1, Event2::class)
	->addListenerForEventType($event2Listener2, Event2::class)
	->addListenerForEventType($allEventsListener);

$dispatcher = new EventDispatcher($listenerProvider);
$dispatcher->dispatch($event1);
$dispatcher->dispatch($event2);

可用方法

Event

EventDispatcher

ListenerProvider

联系方式

您可以通过以下链接在我的社交网络VKontakte上联系我:VKontakte: Максим Епихин

如果您喜欢通过电子邮件交流,可以使用以下邮箱地址:mepihindeveloper@gmail.com

我在YouTube上的频道,专注于开发网页和游戏项目:YouTube: Максим Епихин

您可以通过以下链接支持我,通过Яндекс.Деньги转账:转账